我正在读:
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
它首先表明:
不应使用此选项(-fwhole-program
)与-flto
结合使用。相反,依赖链接器插件应该为提供更安全、更精确的信息。
然后,它暗示:
如果程序不需要导出任何符号,则可以将-flto
和-fwhole-program
结合起来,以允许过程间优化器使用更激进的假设,这可能会带来更好的优化机会。当链接器插件处于活动状态时,不需要使用-fwhole-program
(参见-fuse-linker-plugin
)。
这是否意味着从理论上讲,在-flto
中使用-fuse-linker-plugin
总是比在-flto
中使用-fwhole-program
获得更好的优化可执行文件
我尝试使用ld
分别连接-fuse-linker-plugin
和-fwhole-program
,但可执行文件的大小至少是不同的。
附注:我在CentOS 6上使用的是gcc 4.6.2和ld 2.21.53.0.1。
发布于 2017-02-09 14:54:21
更新:参见下面的@PeterCordes评论。本质上,-fuse-linker-plugin不再是必需的。
这些差异是微妙的。首先,了解-flto的实际用途。它本质上创建了一个可以在以后优化的输出(在“链接时”)。
- case 所做的是假设“当前编译单元代表正在编译的整个程序”,而不管实际情况是否如此。因此,GCC将假设它知道调用特定函数的所有位置。正如它所说的,它可能会使用更积极的过程间优化器。我稍后会解释这一点。
最后,-fuse-linker-plugin实际上是在链接时执行通常在执行每个编译单元时执行的优化。因此,这个插件被设计成与-flto配对,因为-flto意味着保存足够的信息以便以后进行优化,而-fuse-linker-plugin意味着实际执行这些优化。
那么,它们的不同之处在哪里?嗯,正如GCC文档所建议的那样,使用- Well program在原则上没有优势,因为该选项假设了一些您必须确保为真的东西。要打破它,只需在一个.cpp文件中定义一个函数,然后在另一个文件中使用它。你会得到一个链接器错误。
全程序有什么优势吗?好吧,如果你只有一个编译单元,那么你可以使用它,但老实说,它也不会更好。我能够通过使用等价的程序获得不同大小的可执行文件,但当检查实际生成的机器代码时,它们是相同的。事实上,我看到的唯一区别是带有调试信息的行号是不同的。
https://stackoverflow.com/questions/15606993
复制相似问题