Почему я не могу PRELOAD мой собственный libc.so.6 для запуска динамического исполняемого файла - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь запустить динамический исполняемый файл (xxx), но получаю следующую ошибку:

$ ./xxx
./xxx: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./xxx)
./xxx: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by ./xxx)

Поскольку libc в системе в версии 2.12 и слишком стар для моего двоичного файла.

Я скопировал версию 2.27 libc, которая будет работать с этим конкретным двоичным файлом.Если я пытаюсь запустить его с помощью LD_PRELOAD:

$ LD_PRELOAD="./libc.so.6" ./xxx
ERROR: ld.so: object './libc.so.6' from LD_PRELOAD cannot be preloaded: ignored.
./xxx: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./xxx)
./xxx: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by ./xxx)

Система является сервером RedHat 6:

$ uname -a
Linux platinum 2.6.32-754.3.5.el6.x86_64 #1 SMP Thu Aug 9 11:56:22 EDT 2018 x86_64 GNU/Linux

Те же шаги работают вместо этого на моем компьютере с Ubuntu 18.10.Почему я не могу распространять свой собственный libc?Кроме того, почему ld.so не может дать более исчерпывающее объяснение того, почему мой libc не может быть предварительно загружен?

Я мог бы добавить, что произойдет следующее:

$ /lib64/ld-linux-x86-64.so.2 ./libc.so.6 
Segmentation fault (core dumped)

Так что я предполагаюбинарный файл, который я использую, скорее всего несовместим с ядром RedHat.

1 Ответ

0 голосов
/ 13 сентября 2018

Мне удалось найти решение, но для этого потребовалось скомпилировать GLIBC 2.17 на сервере RedHat. Я опубликую инструкции, которые я использовал, если они пригодятся другим: $ cd /tmp $ wget https://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz $ tar xzvf glibc-2.17.tar.gz $ mkdir build-glibc $ cd build-glibc $ ../glibc-2.17/configure --disable-sanity-checks $ make $ cd - $ cp /tmp/build-glibc/libc.so /tmp/build-glibc/elf/ld-linux-x86-64.so.2 . $ LD_PRELOAD="./libc.so:/lib64/libpthread.so.0:/lib64/libkrb5.so.3:/lib64/libk5crypto.so.3:/lib64/libdl.so.2:/lib64/libm.so.6:/lib64/libcom_err.so.2:/lib64/libkrb5support.so.0:/lib64/libkeyutils.so.1:/lib64/libresolv.so.2:/lib64/libselinux.so.1" ./ld-linux-x86-64.so.2 ./xxx

Мне также пришлось использовать новый динамический загрузчик, так как старый был несовместим с GLIBC 2.17: $ LD_PRELOAD="./libc.so" ./xxx ./xxx: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...