Saya memiliki sistem lawas dengan glibc yang sangat lama, yang tidak dapat kami tingkatkan tanpa menimbulkan serangkaian pekerjaan pengujian / validasi.
Saya perlu menjalankan program yang lebih baru (seperti Java 1.7) pada sistem itu beberapa kali sekarang. Saya memilih solusi chroot, di mana saya mengemas semua lib yang dibutuhkan, dan menjalankan layanan dalam chroot.
Chroot sangat terbatas, dan saya lebih suka mencoba menyelesaikan masalah dengan LD_LIBRARY_PATH. Sayangnya, saya mendapatkan kesalahan tentang libc.so.6: cannot handle TLS data
ketika saya mencobanya.
Ternyata saya butuh /lib/ld-linux.so.2
dari chroot juga. Ini bekerja:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Namun, java
menggagalkan trik saya dengan memeriksa /proc/self/cmdline
untuk menentukan dari mana memuat pustaka, yang gagal jika biner tidak bernama 'bin / java'. Juga java mengeksekusi dirinya sendiri saat startup, lebih rumit lagi.
Dalam upaya terakhir untuk membuat karya ini, saya membuka java binary dengan hex editor dan mengganti string /lib/ld-linux.so.2
dengan /home/chroot/ld.so
(dan membuat symlink ke ld-linux.so.2
), dan berhasil!
Tapi saya pikir semua orang akan setuju bahwa itu adalah kludge besar untuk menulis ulang jalur setiap biner baru ke jalur absolut dari sistem bersarang.
Adakah yang tahu cara yang lebih bersih untuk menggunakan lintasan pustaka kustom termasuk ld-linux.so khusus?
sumber
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
, di mana $ JAVA adalah direktori JRE, dan di mana saya telah mengumpulkan semua pustaka dependen dan meletakkannya dilib/
direktori JRE.ldd $JAVA/bin/java
mendapatkan ist. Ada juga beberapa libc dinamis yang Anda butuhkan seperti libnss.so