2015-06-26 3 views
0

Хорошо, поэтому я хочу установить ссылку на более низкую версию libc/glibc для совместимости. Я заметил это ответ на вопрос о том, как это сделать, на случай к случаю основе:Укажите, какая версия символов доступна для ссылки (в libc)?

How can I link to a specific glibc version? 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 [email protected] 
4878d610 T [email protected]@GLIBC_2.3 
48885c20 T [email protected]_2.0 

Однако, если я пытаюсь связать против [email protected]_2.0:

__asm__(".symver realpath,[email protected]_2.0"); 

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

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

Однако, используя [email protected]_2.3 работает ... и код из примера , [email protected]_2.2.5 работает - хотя, по данным nm, такой символ не существует. (FYI, если я компилирую без инструкции __asm__, а затем проверяю на nm, я вижу, что она связана с [email protected]_2.3, что имеет смысл, и я подтвердил, что ссылка на [email protected]_2.2.5 работает.)

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

Спасибо!

ответ

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 НКУ для принудительной привязки к 32-битной библиотеке C.

+0

* facepalm * Yup, вы правы ... Я действительно смотрел на/lib/вместо/lib64/binary. Спасибо, что указали на очевидное! –

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