我正在arm-none-eabi-gcc
为基于 Cortex-M4 的微控制器编译可执行文件。非性能关键代码使用-Os
(针对可执行代码大小进行优化)和性能关键部分与另一个优化标志进行编译,例如。-Og
/-O2
等。
-flto
在这样的构建中使用是否安全?如果是这样,应该将哪个优化标志传递给链接器?
根据关于优化选项的GCC 文档:
建议您使用相同的选项编译所有参与相同链接的文件
这样的说法是相当模糊的。然而,在深入研究 GCC 5 的发行说明时,还有一些额外的细节:
命令行优化和目标选项现在按功能流式传输,并由链接时优化器支持。此更改使链接时优化更透明地替代了每个文件的优化。现在可以构建需要针对不同翻译单元(例如 -ffast-math、-mavx 或 -finline)进行不同优化设置的项目。
还有关于哪些标志受此类限制影响以及哪些不受此类限制影响的信息:
请注意,这仅适用于那些可以传递给优化和目标属性的命令行选项。影响全局代码生成的命令行选项(例如 -fpic)、警告(例如 -Wodr)、影响静态变量优化方式的优化(例如 -fcommon)、调试输出(例如 -g)和 -- param 参数只能应用于整个链接时优化单元。在这些情况下,建议在编译时和链接时始终使用相同的选项。
在您的场景中,优化标志和可以作为优化属性传递-Og
,并且不属于编译时间和链接时间标志应该相同的情况。所以是的,在这样的构建中使用它应该是安全的。-O2
-Os
-flto
关于在链接时传递的优化标志,如发行说明中所述:
与早期的 GCC 版本相反,链接命令行上传递的优化和目标选项被忽略。
GCC 会自动确定使用哪个优化级别,即编译目标文件时使用的最高级别。因此,您不需要将任何-O
优化选项传递给链接器。