Как связать 2 версии libc в одном приложении? - PullRequest
0 голосов
/ 21 марта 2012

Как я могу заставить один конкретный модуль моего приложения использовать более старую версию libc?

У меня есть два .so файла, которые мне нужно связать в моем приложении, но один из них будет толькоработать с более старой версией libc, и одна будет работать только с более новой версией.

У меня действительно есть источник, но до сих пор поиск источника ошибки не удался.Я не прекращаю этот поиск, поскольку это, безусловно, правильное исправление.

В качестве временной меры, есть ли способ заставить компоновщик использовать более старый libc только для этой части приложения?

У меня все в порядке со статическими ссылками и / или с настройкой символических ссылок.

Обновление / уточнение:

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

Даже если / когда я это сделаюнайти настоящую ошибку, это само по себе кажется достаточно интересным испытанием.

Возможно ли это вообще?

Спасибо

1 Ответ

1 голос
/ 22 марта 2012

Технически, вы можете динамически загрузить альтернативную библиотеку с помощью dlopen, а затем извлечь адрес символов из нее с помощью dlsym.Это позволяет вам получить адрес функций и вызвать их код вместо стандартных.См., Например, эту страницу документации компоновщика .

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

Понимание того, что не так с вашим кодом (или libc), определенно будет лучшим подходом

Обновление :

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

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

...