2017-08-11 146 views
1

我正在编译一个基于Cortex-M4的微控制器的可执行文件arm-none-eabi-gcc。非性能关键代码与-Os(针对可执行代码大小进行了优化)以及具有另一个优化标志的性能关键部分进行编译,例如。 -Og/-O2如何在不同优化的目标文件中使用GCC LTO?

在这样的构建中使用-flto安全吗?如果是这样,哪个最优化标志应该传递给链接器?

回答

1

按照GCC documentation关于优化选项:

建议您编译所有的文件,参与同一链路使用相同的选项

这种说法是相当模糊的。然而,挖入release notes of GCC 5时,有一些额外的细节:

命令行优化和目标选项现在流在每个功能的基础,并通过链接时优化荣幸。此更改使链接时间优化成为每个文件优化更加透明的替代方案。现在可以构建不同翻译单元需要不同优化设置的项目(例如-ffast-math,-mavx或-finline)。哪些标志受到这些限制的影响,这

而且也是信息不:

注意,这仅适用于可通过优化和目标属性的命令行选项。影响全局代码生成的命令行选项(如-fpic),警告(如-Wodr),影响静态变量优化方式的优化(如-fcommon),调试输出(如-g)和 - 参数参数只能应用于整个链接时间优化单元。在这些情况下,建议在编译时和链接时均始终使用相同的选项。

在你的情况下,优化标志-Og-O2-Os可以作为优化的属性被传递,并且不落入情况下,编译时和链接时的标志应该是相同的。所以是的,在这样的构建中使用-flto应该是安全的。

关于在链接时通过的优化标志,如发行说明中指出:

相反,早期的GCC版本中,链接命令行上传递的优化和目标选项 被忽略。

GCC自动确定使用哪个优化级别,这是编译目标文件时使用的最高级别。因此,您无需将您的任何-O优化选项传递给链接器。

+0

哇,这太好了,谢谢你找到它并在这里发帖。这是否也适用于GCC 6和7? – Venemo

+0

@Venemo我没有看到任何在GCC 6和7更新日志或其他相关文档中提到的这种行为。所以它可能也适用于新版本的GCC。 – Pyves

+1

谢谢!我已经接受了你的答案! – Venemo