Мне нужно запустить относительно новый пакет на не очень новом RHEL 5.6.
У меня есть сторонняя библиотека (lib3rdparty.so
), которая скомпилирована с glibc 2.6, а в RHEL 5.6 установлено только 2.5. Но в библиотеке есть только пара ссылок на sched_getcpu@@GLIBC_2.6
. Я проверил это так
readelf -s lib3rdparty.so | egrep "@GLIBC_2.[6-9]"
чтобы найти ссылки на что-то более новое, чем GLIBC_2.5
, которое установлено. Выход
0 FUNC GLOBAL DEFAULT UND sched_getcpu@GLIBC_2.6 (62)
0 FUNC GLOBAL DEFAULT UND sched_getcpu@@GLIBC_2.6
Итак, у меня есть только одна функция из GLIBC_2.6
. Теперь я хочу заставить библиотеку думать, что у меня есть эта функция. Для этого я подделал небольшую библиотеку (libcheat.so
), как упомянуто здесь . Теперь у меня есть файл libcheat.so
, который при запуске через readelf
покажет эту строку:
10 FUNC GLOBAL DEFAULT 11 sched_getcpu@@GLIBC_2.6
С этой библиотекой мне удалось успешно создать исполняемый файл, который динамически связан с lib3rdparty.so
. Без этой библиотеки я не могу ничего построить, потому что ld
не может найти ссылку на sched_getcpu
.
Но проблема с запуском этого файла: при попытке запустить файл появляется следующая ошибка:
./hello_world: version `GLIBC_2.6' not found (required by ./lib3rdparty.so)
Итак, я считаю, что есть один последний шаг, чтобы заставить его работать, но я не знаю, что делать. Я пытался использовать /etc/ld.conf.preload
и экспортировать LD_LIBRARY_PATH
, чтобы он указывал на мою библиотеку для загрузки раньше других. Но это не будет работать. Пытался запустить его через strace
, но не получил значимого вывода.
Есть идеи?