如何在GCC LTO中使用优化不同的目标文件?

3
我正在使用 arm-none-eabi-gcc 为基于Cortex-M4的微控制器编译可执行文件。非关键性能代码使用 -Os 进行编译(针对可执行代码大小进行优化),而关键性能部分则使用其他优化标志进行编译,例如-Og / -O2等。
在这样的构建中使用 -flto 是否安全?如果是,应该将哪个优化标志传递给链接器?
1个回答

2
根据GCC文档中的优化选项:

建议使用相同的选项编译参与同一链接的所有文件。

这种说法相当模糊。然而,当深入研究GCC 5版本发布说明时,有一些额外的细节:

现在,命令行优化和目标选项按函数基础进行流式传输,并由链接时优化器支持。此更改使链接时优化成为逐文件优化的更透明替代品。现在可以构建需要不同翻译单元的不同优化设置的项目(例如-ffast-math,-mavx或-finline)。

还有关于哪些标志受到此类限制,哪些标志不受影响的信息:
请注意,这仅适用于可以传递到优化和目标属性的命令行选项。影响全局代码生成(例如-fpic)、警告(例如-Wodr)、影响静态变量优化方式的优化(例如-fcommon)、调试输出(例如-g)以及--param参数的命令行选项只能应用于整个链接时优化单元。在这些情况下,建议在编译时和链接时始终使用相同的选项。
在您的情况下,优化标志 -Og、-O2 和 -Os 可以作为优化属性传递,并且不属于编译时间和链接时间标志必须相同的情况。因此,在这样的构建中使用 -flto 应该是安全的。
关于在链接时间传递的优化标志,如发布说明所述:
与早期的 GCC 版本不同,忽略了传递到链接命令行上的优化和目标选项。
GCC会自动确定使用哪个优化级别,这是在编译目标文件时使用的最高级别。因此,您不需要将任何-O优化选项传递给链接器。

哇,这太好了,谢谢你找到并在这里发布。这也适用于GCC 6和7吗? - Venemo
@Venemo我没有在GCC 6和7 changelog或其他相关文档中看到有关此行为更改的提及。因此,它可能也适用于更新版本的GCC。 - Pyves
我认为-Os / -O3选项效果不佳。我有一个文件,它非常受益于-O3优化,为了保持优化级别为-O3,我基本上需要仅针对此文件禁用LTO(使用-fno-lto)。 - RushPL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接