Итак, я хочу сделать ссылку на более низкую версию 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? Я проверяю не ту библиотеку?
Спасибо!