如果我想用-flto
编译我的项目是否足以用--enable-gold
构建gcc或者我是否还需要构建黄金并用它替换ld?我还需要其他标志吗?即我这样做
gcc -flto one.c two.c
根据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版本相反,忽略了在链接命令行上传递的优化和目标选项。
我在文档中找不到任何确认这一点的东西,但实验上LTO仅在启用某种级别的编译器优化时启用。因此,在命令行中添加-O
,您将看到LTO的结果。
(我认为这就是为什么-O2
是-flto
所有gcc手册页示例的一部分。)