我在将 libgcc 链接到静态链接 .so 时遇到问题
它仅在使用 -m64
链接 64 位模块时发生
Ubuntu 64 位 12.10 gcc 4.7
在 Ubuntu 64 位 12.04 gcc 4.6 上也失败了
32位没问题
$gcc -fPIC -c -o hello.o hello.c -m32
$gcc -shared -m32 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic -lc
$ ldd libhello.so
statically linked
64 位失败
$ make
gcc -fPIC -c -o hello.o hello.c
gcc -shared -m64 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic -lc
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a(iofclose.o): relocation R_X86_64_32 against `__gcc_personality_v0' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libhello.so] Error 1
你好.c
#include <stdio.h>
int f(){
FILE *out = fopen("/tmp/x.log", "wb");
fclose(out);
return 1;
}
生成文件
all: libhello.so
libhello.so: hello.o
gcc -shared -m64 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic -lc
hello.o: hello.c
gcc -fPIC -c -o hello.o hello.c
clean:
rm -f hello.o libhello.so
最佳答案
答案基本上是“你不能那样做”。您正在尝试将非 PIC 代码链接到共享库,这在 x86_64 (amd64) 架构上根本不可能。您需要静态但 PIC 版本的 libgcc,我怀疑这只是问题的开始。
通常共享 libgcc 的原因之一是给定的运行可执行文件必须具有 libgcc 维护的一些关键数据结构的一个且只有一个副本。静态链接对于最终的可执行文件是有意义的,因为只有一个副本将是静态链接到可执行文件中的副本,但是动态对象的全部要点是加载到另一个可执行文件中(这又将有自己的副本libgcc,共享的或静态的)。
关于c - 为什么不能在 ubuntu 上链接 64 位静态 libgcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15072196/