GCC手动配置-Os对应优化flag所得二进制与直接用-Os不一致原因咨询
GCC手动对齐-Os优化参数后二进制不一致的原因
导致该问题的核心原因有以下几点:
-Os并不仅仅是一系列-f开头优化开关的集合,它还会全局开启-fsize-opt参数,该参数会告诉所有优化pass优先选择压缩代码尺寸的方案,而非-O1默认的优先提升运行速度的决策逻辑。这个全局开关你没有手动配置,哪怕子开关完全对齐,各优化阶段的决策结果也会存在差异。-Os会调整大量优化参数的阈值,比如内联函数的尺寸上限、循环展开的最大允许次数、指令调度的权衡权重等,这些阈值无法通过单独开关-f系列参数修改,是-Os等级独有的配置。- 你操作优化开关的顺序可能存在生效冲突,GCC的命令行参数按从左到右的顺序生效,你先开启
-falign-functions等参数后又关闭,虽然最终状态是关闭,但部分依赖参数初始化的前置逻辑可能已经读取到了开启状态的配置,产生意料外的差异。 - 目标架构存在专属优化逻辑,你编译的目标mcu68332属于m68k架构,GCC 4.8.x对该架构的
-Os优化有单独的适配逻辑,比如短跳转优先使用、数据段对齐规则调整等,这些逻辑不属于通用优化开关的覆盖范围。 - 你没有完全对齐
-Os隐含的所有开关,GCC 4.8.0官方文档列出的-Os开关是通用架构的默认列表,针对特定架构、小版本更新(你用的是4.8.2而非文档对应的4.8.0)都会存在开关增减,你手动整理的开关列表存在遗漏。
内容的提问来源于stack exchange,提问作者Damuno
相关产品推荐
相关产品推荐

