GCC -nostdlib завершается ошибкой с неопределенной ссылкой на `__libc_csu_fini ' - PullRequest
1 голос
/ 04 ноября 2010

Я предоставляю компоновщику свои файлы: ld-2.7.so, libc-2.7.so и crt1.o, но он не может успешно скомпилироваться.Можно ли ссылаться на другой glibc, отличный от используемого по умолчанию?

(Статическая компиляция или установка отдельного glibc невозможна.)

gcc -Wl,-dynamic-linker,ld-2.7.so,libc-2.7.so,crt1.o -nostdlib program.c

crt1.o: In function `_start':  
(.text+0x12): undefined reference to `__libc_csu_fini'  
crt1.o: In function `_start':  
(.text+0x19): undefined reference to `__libc_csu_init'  
/tmp/user/1000/ccauFlwt.o: In function `findsize':  
program.c:(.text+0x21): undefined reference to `stat'  
/tmp/user/1000/ccauFlwt.o: In function `findtime':  
program.c:(.text+0x4c): undefined reference to `stat'  
collect2: ld returned 1 exit status  

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Я узнал, как это сделать:

rpath указывает, где находятся предоставленные библиотеки. Эта папка должна содержать: libc.so.6, libdl.so.2, libgcc_s.so.1 и, возможно, больше. Проверьте с помощью strace, какие библиотеки использует ваш двоичный файл.

ld.so - предоставленный компоновщик

gcc -Xlinker -rpath = / default / path / to / библиотеки

1 голос
/ 09 ноября 2010

Как сказал @onemasse, вам также нужны заголовочные файлы, совместимые с этой версией libc.Между версиями glibc все равно все равно работает, но на это нельзя полагаться.

В противном случае, я бы посоветовал вам использовать экспорт LD_PRELOAD_PATH туда, где находится ваш другой libc, до запуска новой библиотеки.

Ночто вам действительно нужно, так это кросс-компиляция в linux, для linux, но с другим libc.Взгляните на crosstool .

0 голосов
/ 09 ноября 2010

Если вы хотите создать ссылку на другой libc, чем тот, который предоставляется системой, вам также необходимо скомпилировать вашу программу с заголовочными файлами, совместимыми с этой версией libc.

Кроме того, я не знаком сопция "-dynamic-linker".Это не на странице man для gcc.Я действительно не могу понять, что вы пытаетесь сделать.

Может быть, вы должны попробовать это вместо этого и работать оттуда:

gcc -ldl program.c -o program

Обычно вам не нужно явно ссылатьсяс "libc" или "crt1.o".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...