0

gcc 专家,

我正在尝试将 gcc lto 与库档案一起使用,因为我的系统(RedHat Enterprise Linux 5.7)附带的 gcc 不适用于 -flto(对于我的 Ubuntu 14.10 也不适用),所以我从头开始构建 binutils && gcc。

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

// 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 与图书馆档案一起工作?

您的帮助将不胜感激。

非常感谢。

4

1 回答 1

1

链接时,库在命令行上列出的顺序很重要。所以当从档案中编译时,你应该交换 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()正在内联。

于 2015-04-24T00:15:14.830 回答