我正在编译一个基于Cortex-M4的微控制器的可执行文件arm-none-eabi-gcc
。非性能关键代码与-Os
(针对可执行代码大小进行了优化)以及具有另一个优化标志的性能关键部分进行编译,例如。 -Og
/-O2
等如何在不同优化的目标文件中使用GCC LTO?
在这样的构建中使用-flto
安全吗?如果是这样,哪个最优化标志应该传递给链接器?
我正在编译一个基于Cortex-M4的微控制器的可执行文件arm-none-eabi-gcc
。非性能关键代码与-Os
(针对可执行代码大小进行了优化)以及具有另一个优化标志的性能关键部分进行编译,例如。 -Og
/-O2
等如何在不同优化的目标文件中使用GCC LTO?
在这样的构建中使用-flto
安全吗?如果是这样,哪个最优化标志应该传递给链接器?
按照GCC documentation关于优化选项:
建议您编译所有的文件,参与同一链路使用相同的选项
这种说法是相当模糊的。然而,挖入release notes of GCC 5时,有一些额外的细节:
命令行优化和目标选项现在流在每个功能的基础,并通过链接时优化荣幸。此更改使链接时间优化成为每个文件优化更加透明的替代方案。现在可以构建不同翻译单元需要不同优化设置的项目(例如-ffast-math,-mavx或-finline)。哪些标志受到这些限制的影响,这
而且也是信息不:
注意,这仅适用于可通过优化和目标属性的命令行选项。影响全局代码生成的命令行选项(如-fpic),警告(如-Wodr),影响静态变量优化方式的优化(如-fcommon),调试输出(如-g)和 - 参数参数只能应用于整个链接时间优化单元。在这些情况下,建议在编译时和链接时均始终使用相同的选项。
在你的情况下,优化标志-Og
,-O2
和-Os
可以作为优化的属性被传递,并且不落入情况下,编译时和链接时的标志应该是相同的。所以是的,在这样的构建中使用-flto
应该是安全的。
关于在链接时通过的优化标志,如发行说明中指出:
相反,早期的GCC版本中,链接命令行上传递的优化和目标选项 被忽略。
GCC自动确定使用哪个优化级别,这是编译目标文件时使用的最高级别。因此,您无需将您的任何-O
优化选项传递给链接器。
哇,这太好了,谢谢你找到它并在这里发帖。这是否也适用于GCC 6和7? – Venemo
@Venemo我没有看到任何在GCC 6和7更新日志或其他相关文档中提到的这种行为。所以它可能也适用于新版本的GCC。 – Pyves
谢谢!我已经接受了你的答案! – Venemo