2013-02-25 1 views
3

У меня есть проблема ссылка libgcc в статический связанный .soпочему косяк ссылка 64bit статический libgcc на убунту

это происходит только при соединении модуля 64-битного с -m64

Ubuntu 64bit 12,10 GCC 4.7

также не на Ubuntu 64bit 12,04 GCC 4,6

32bit без проблем

$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 

64bit не удалось

$ 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 

hello.c

#include <stdio.h> 

int f(){ 

FILE *out = fopen("/tmp/x.log", "wb"); 
fclose(out); 

return 1; 
} 

Makefile

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 
+1

В соответствии с [настоящей статьей] (http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml?part=1&chap=3) это означает, что «libc.a» не был скомпилирован с -fPIC, но должен быть статически связан в библиотеке -fPIC. – BeniBela

+0

Если вы компилируете на 64-разрядную машину, не можете ли вы опустить флаг -m64? Это поможет? –

+0

@RandallCook такая же ошибка – farmer1992

ответ

1

Ответ в основном "вы не можете сделать это." Вы пытаетесь связать не-PIC-код с общей библиотекой, что просто невозможно в архитектуре x86_64 (amd64). Вам понадобится статическая версия PIC версии libgcc, и я подозреваю, что это будет только началом ваших проблем.

Одна из причин, по которой libgcc обычно используется совместно, заключается в том, что данный исполняемый исполняемый файл должен иметь одну и только одну копию некоторых основных структур данных, поддерживаемых libgcc. Статическая привязка имеет смысл для окончательного исполняемого файла, так как эта одна и только одна копия будет одной статически связанной с исполняемым файлом, но вся точка динамического объекта должна быть загружена в другой исполняемый файл (который, в свою очередь, будет иметь свою собственную копию libgcc, либо общий, либо статический).

+2

Спасибо. Моя проблема в том, что мой .so не может быть загружен на Ubuntu 11.10, потому что U 11.10 не имеет совместимого с libgcc 2.14 символа. – farmer1992

Смежные вопросы