如何让gcc LTO与图书馆档案合作?

时间:2015-03-24 02:28:32

标签: gcc plugins linker archive lto

gcc专家,

我试图将gcc lto与库档案一起使用,因为gcc附带我的系统(RedHat Enterprise Linux 5.7)不能与-flto一起使用(我的Ubuntu 14.10都没有),所以我建立了binutils&& gcc从头开始。

这是我做的:
1.使用--enable-plugins建立binutils-2.22 2.使用--with-plugin-ld=/path/to/ld/built/in/step1 --enable-lto建立gcc-4.7.2 3.然后进行以下简单测试:

// 1.c:  
int foo(void)  
{ return 0; }  

// 2.c:  
extern int foo(void)  
int main(void)  
{ return foo(); }

以下内容可以foo()内联:

my_gcc -O3 -flto -c -o 1.o 1.c  
my_gcc -O3 -flto -c -o 2.o 2.c  
my_gcc -O3 -flto -o a.out 1.o 2.o

虽然以下不能:

my_gcc -O3 -flto -c -o 1.o 1.c  
my_gcc -O3 -flto -c -o 2.o 2.c  
my_ar cr --plugin <my_gcc>/libexec/gcc/x86_64-redhat-linux/4.7.2/liblto_plugin.so 1.a 1.o  
my_ar cr --plugin <my_gcc>/libexec/gcc/x86_64-redhat-linux/4.7.2/liblto_plugin.so 2.a 2.o  
gcc -O3 -flto -fuse-linker-plugin -o a.out 1.a 2.a

由于我正在使用的产品的构建系统必须使用存档,那么我可以做些什么来让lto使用库存档?

非常感谢您的帮助。

非常感谢。

1 个答案:

答案 0 :(得分:1)

链接时,命令行中列出库的顺序很重要。因此,在从档案编译时,您应该交换1.a和2.a:

require 'colorize'

puts "This is blue".colorize(:blue)

我使用gcc 4.9.2进行了测试,使用gcc -O3 -flto -fuse-linker-plugin -o a.out 2.a 1.a 获得的反汇编表明objdump -d a.out正在内联。