21

我正在阅读: http:
//gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

它首先建议:不应
-flto使用此选项 ( ) 结合使用。-fwhole-program相反,依赖链接器插件应该提供更安全、更精确的信息。

然后,它建议:
如果程序不需要导出任何符号,则可以组合-flto-fwhole-program允许过程间优化器使用更积极的假设,这可能会导致改进的优化机会。-fwhole-program当链接器插件处于活动状态时,不需要使用(请参阅 参考资料-fuse-linker-plugin)。

这是否意味着在理论上,使用-fuse-linker-pluginwith-flto总是比使用-fwhole-programwith获得更好的优化可执行文件-flto

我尝试使用单独ld链接-fuse-linker-plugin和链接-fwhole-program,并且可执行文件的大小至少是不同的。

PS 我在 CentOS 6 上使用 gcc 4.6.2 和 ld 2.21.53.0.1。

4

1 回答 1

9

更新:请参阅下面的@PeterCordes 评论。本质上,不再需要-fuse-linker-plugin 。

这些差异是微妙的。首先,了解-flto的实际作用。它本质上创建了一个可以稍后优化的输出(在“链接时”)。

-fwhole -program所做的是假设“当前编译单元代表正在编译的整个程序”,无论实际情况是否如此。因此,GCC 将假定它知道调用特定函数的所有位置。正如它所说,它可能会使用更积极的过程间优化器。我稍后会解释。

最后,-fuse-linker-plugin所做的实际上是在链接时执行优化,这通常会在执行每个编译单元时完成。所以,这个被设计为与-flto配对,因为-flto意味着保存足够的信息以便以后进行优化,而-fuse-linker-plugin意味着实际进行这些优化。

那么,它们有什么不同呢?好吧,正如 GCC 文档所建议的那样,原则上使用-fwhole-program没有任何优势,因为该选项假定您必须确保某些东西是正确的。要打破它,只需在一个 .cpp 文件中定义一个函数并在另一个文件中使用它。您将收到链接器错误。

-fhole-program有什么优势吗?好吧,如果您只有一个编译单元,那么您可以使用它,但老实说,它不会更好。通过使用等效程序,我能够获得不同大小的可执行文件,但是在检查实际生成的机器代码时,它们是相同的。事实上,我看到的唯一区别是带有调试信息的行号不同。

于 2017-02-09T06:54:20.950 回答