【发布时间】:2015-10-19 16:52:40
【问题描述】:
如果我想用-flto 编译我的项目,用--enable-gold 构建gcc 就足够了,还是我还需要构建gold 并用它替换ld?我还需要其他标志吗?即我正在这样做
gcc -flto one.c two.c
【问题讨论】:
标签: gcc ld binutils lto gold-linker
如果我想用-flto 编译我的项目,用--enable-gold 构建gcc 就足够了,还是我还需要构建gold 并用它替换ld?我还需要其他标志吗?即我正在这样做
gcc -flto one.c two.c
【问题讨论】:
标签: gcc ld binutils lto gold-linker
根据https://gcc.gnu.org/wiki/LinkTimeOptimization#Requirements,
尽管有“链接时间”的名称,LTO 不需要使用任何特殊的链接器功能。所需的基本机制是检测目标文件中的 GIMPLE 部分。这目前在
collect2中实现。因此,LTO 可以在 GCC 已经支持的任何链接器上工作。
此外,GCC documentation 的 -fuse-linker-plugin 表示:
当 GCC 中的 LTO 支持启用并且 GCC 被配置为与支持插件(GNU ld 2.21 或更新版本或黄金)的链接器一起使用时,此选项默认启用。
因此您根本不需要gold,即使您想使用特殊的“链接器插件”功能从库档案中的目标文件中获取优化信息。
-flto documentation 中有使用示例。要么
gcc -o myprog -flto -O2 foo.c bar.c
或
gcc -c -O2 -flto foo.c
gcc -c -O2 -flto bar.c
gcc -o myprog -flto -O2 foo.o bar.o
会起作用的。
截至GCC 4.9,您甚至不需要-flto 进行链接:
唯一需要记住的重要一点是,要启用链接时优化,您需要使用 GCC 驱动程序来执行链接步骤。如果所涉及的任何对象是使用
-flto编译的,则 GCC 会自动执行链接时优化。
截至GCC 5:
与早期的 GCC 版本相反,链接命令行上传递的优化和目标选项被忽略。
【讨论】:
-plugin 是一个无法识别的选项。另外,使用您的最后一个示例,如果我将 -flto 离开最后阶段,则生成的可执行文件的 md5sum 与 -flto 相同。
-plugin?
ld,我通过ld -plugin进行了测试。从阅读更多gcc 文档来看,如果编译是使用-flto 完成的,并且gcc 用于链接阶段,那么无论如何都会完成链接时间优化。