gcc专家,
我正试图将gcc-lto与库档案一起使用,因为我的系统(RedHat Enterprise Linux 5.7)附带的gcc不与-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.a和2.a:
gcc -O3 -flto -fuse-linker-plugin -o a.out 2.a 1.a
我使用gcc 4.9.2进行了测试,使用objdump -d a.out
获得的反汇编显示foo()
正在内联。