У меня есть устаревшая система с очень старым glibc, которую мы не можем модернизировать, не взяв на себя кучу работ по тестированию / валидации.
Мне нужно было запускать новые программы (например, Java 1.7) в этой системе несколько раз. Я выбрал решение chroot, где я упаковываю все необходимые библиотеки и запускаю сервис в chroot.
Однако chroot очень ограничен, и я лучше попробую решить проблему с LD_LIBRARY_PATH. К сожалению, я получаю сообщение об ошибке, libc.so.6: cannot handle TLS data
когда пытаюсь это сделать.
Оказывается, мне нужно /lib/ld-linux.so.2
от chroot. Это работает:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Тем не менее, java
сорвал мой трюк, проверив, /proc/self/cmdline
чтобы определить, откуда загрузить его библиотеки, что не удается, если двоичный файл не был назван «bin / java». Также Java запускает себя во время запуска, что еще более усложняет ситуацию.
В последней попытке сделать эту работу, я открыл двоичный файл Java с помощью шестнадцатеричного редактора и заменил строку /lib/ld-linux.so.2
на /home/chroot/ld.so
(и сделал символическую ссылку на ld-linux.so.2
), и это сработало!
Но я думаю, что все согласятся с тем, что переписывать путь каждого нового двоичного файла на абсолютный путь вложенной системы - это огромный шаг.
Кто-нибудь знает более чистый способ использования пользовательского пути к библиотеке, включая пользовательский ld-linux.so?
источник
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
, где $ JAVA - это каталог JRE, и где я собрал все зависимые библиотеки и поместил их вlib/
каталог JRE.ldd $JAVA/bin/java
получать ист. Есть также некоторые динамический Libc те , которые вы обязательно хотели libnss.so