Скажите, какие версии символов доступны для компоновки (в libc)?

Итак, я хочу сделать ссылку на более низкую версию libc/glibc для совместимости. Я заметил этот ответ о том, как это сделать, в каждом конкретном случае:

Как сделать ссылку на конкретную версию glibc? https://stackoverflow.com/a/2858996/920545

Однако, когда я попытался применить это сам, я столкнулся с проблемами, потому что я не могу понять, какой более низкий номер версии я должен использовать для ссылки. Используя пример в ответе, если я использую «nm» для проверки символов, предоставленных моим /lib/libc.so.6 (который в моем случае является ссылкой на libc-2.17.so), я вижу, что это кажется, предоставляет версии 2.0 и 2.3 realpath:

> nm /lib/libc.so.6 | grep realpath@
4878d610 T realpath@@GLIBC_2.3
48885c20 T realpath@GLIBC_2.0

Однако, если я попытаюсь сделать ссылку на realpath@GLIBC_2.0:

__asm__(".symver realpath,realpath@GLIBC_2.0");

... я получаю сообщение об ошибке:

> gcc -o test_glibc test_glibc.c
/tmp/ccMfnLmS.o: In function `main':
test_glibc.c:(.text+0x25): undefined reference to `realpath@GLIBC_2.0'
collect2: error: ld returned 1 exit status

Однако использование realpath@GLIBC_2.3 работает... и код из примера realpath@GLIBC_2.2.5 работает, хотя, согласно nm, такого символа не существует. (К вашему сведению, если я скомпилирую без каких-либо инструкций __asm__, а затем проверю с помощью nm, я вижу, что он связан с realpath@GLIBC_2.3, что имеет смысл; и я подтвердил, что ссылка на realpath@GLIBC_2.2.5 работает.)

Итак, мой вопрос: как, черт возьми, узнать, с какой версией различных функций я могу связать? Или даже которые доступны? Есть ли какие-то другие kwargs, которые я должен скормить nm? Я проверяю не ту библиотеку?

Спасибо!


person Paul Molodowitch    schedule 26.06.2015    source источник


Ответы (1)


Мне кажется, вы немного перепутали свои библиотеки и бинарники...

/lib/libc.so.6 в большинстве дистрибутивов Linux является 32-битным общим объектом и должен содержать символы *@GLIBC_2.0. Однако, если вы работаете на платформе x86_64, я ожидаю, что GCC по умолчанию создаст 64-битный двоичный файл. 64-битные двоичные файлы обычно компонуются с /lib64/libc.so.6, который не будет содержать символы совместимости для старой версии glibc, такой как 2.0 - тогда архитектуры x86_64 даже не существовало...

Попробуйте скомпилировать свою программу *@GLIBC_2.0 с флагом -m32 GCC, чтобы принудительно связать 32-битную библиотеку C.

person thkala    schedule 27.06.2015
comment
facepalm Да, вы правы... Я действительно смотрел на двоичный файл /lib/ вместо /lib64/. Спасибо, что указали на очевидное! - person Paul Molodowitch; 09.07.2015