2014-01-29 4 views
8

Кажется, что glibc 2.14 представил новую версию memcpy (для исправления bug 12518). Затем программы, скомпилированные против glibc 2.14+, будут содержать динамическую ссылку на [email protected]_2.14, которая явно недоступна в старых версиях glibc.Как создать обратную динамическую связь?

Однако glibc 2.14+ явно содержит старый символ [email protected]_2.2.5 для обратной совместимости. Я хотел бы иметь возможность компилировать несколько программ таким образом, чтобы они были совместимы с двоичными файлами с более старыми версиями glibc. Как сделать компиляцию программы в системе с glibc 2.14+, чтобы она использовала эту старую версию символа? Если процедура обязательно специфична для компилятора, я использую GCC (но было бы неплохо узнать, как это сделать и для других компиляторов).

(На стороне примечания, я должен признать, что не знаю много о версированных символах, например, как их создавать и как их использовать, или они являются специфичными для ELF или должны рассматриваться как стандартная часть из современных ABI, и мне не удалось найти документацию об этом. Имеются ли хорошие источники информации по этому вопросу?)

ответ

3

Канонический документ об общих библиотеках, управление версиями символов и связанные с ним вопросы - это http://www.akkadia.org/drepper/dsohowto.pdf Ulrich Drepper ,

Чтобы сделать ссылку на старший символ, вам нужно будет найти заголовок, объявляющий его, а затем использовать директиву ассемблера:

extern void nftw_old (int) ; 
asm (".symver nftw_old,[email protected]_2.3.3"); 
void main() 
{ 
    nftw_old(0); 
} 

Обратите внимание, что «нм» скомпилированный исполняемый файла относится к ожидаемая реализация предыдущего ABI [email protected]_2.3.3. (Не пытайтесь запустить эту программу - действительная сигнатура функции nftw (3) отличается.)

+0

Это единственный способ сделать это? Было бы неплохо не изменять исходный код, чтобы изменить привязку. Невозможно ли сообщить компоновщику выбрать версию символа при создании окончательного исполняемого файла, а не делать это на уровне исходного кода? – Dolda2000

+0

Спасибо за ссылку, кстати! – Dolda2000

+0

Это способ сделать это вручную, на уровне контроля версий символов, и это то, о чем я думал, что вам нужно. Более простой способ - установить устаревшую установку программного обеспечения со старыми файлами .a/.so/.h и компиляции/ссылки на них. – fche

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