У мене є застаріла система з дуже старим 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?