Java JDK hilang libjli.so path dalam daftar dependensi, Debian

8

Saya membuat skrip pembuatan chroot jails dan bagian dari otomatisasi itu termasuk menyalin berbagai executable dan dependensinya ke dalam jail. Saya menggunakan baris bash berikut untuk mem-parsing path file dari daftar dependensi (untuk java, misalnya):

$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

Ini berfungsi baik untuk Node.js dan Python, tetapi ketika saya mencoba mengeksekusi javadari dalam penjara, saya mendapatkan kesalahan:

java: kesalahan saat memuat pustaka bersama: libjli.so: tidak bisa membuka file objek bersama: Tidak ada file atau direktori tersebut

Ternyata libjli.so path hilang dari daftar dependensi ... setidaknya yang lddmenunjukkan kita (baris 5):

$ ldd `which java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

Saya menemukan file ...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

... tapi saya ingin tahu mengapa itu tidak terdaftar ldd. Tampaknya ini adalah ketergantungan yang diketahui, tetapi jalurnya tidak diketahui? Bantuan apa pun dihargai!

Rip Leeb
sumber
Pertanyaan menarik, Anda dapat mencoba menanyakan ini di forum openjdk.
Faheem Mitha
Jika seseorang menemukan ini dari google: sepertinya itu adalah duplikat dengan unix.stackexchange.com/questions/16656 , yang memiliki lebih banyak informasi (dan jawaban berbeda).
yshavit

Jawaban:

7

Seharusnya bekerja di luar kotak - tanpa mengacaukan /etc/ld.so.conf* atau ldconfig - dan dapat dengan mudah melakukannya. Cukup pasang / proc di chroot Anda. Saya melakukan ini dengan baris berikut di / etc / fstab di fs root-real saya:

/ proc / var / chroot / ia32 / proc tidak mengikat

Jadi mengikatnya dengan yang asli / proc.

Per https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (saya kira begitu) menentukan $ ASLI untuk menggantikan entri RPATH objdump -p dengan melihat / proc / self / exe.

Berapa kali saya digigit oleh ini dan harus menemukannya kembali? Tolong, oh Google yang perkasa dan bijaksana, bawa aku kembali ke sini secepatnya, jadi aku-masa depan bisa belajar lagi di masa lalu-aku!

Martin Dorey
sumber
1
Terima kasih. Menunjukmu /proc/self/exeadalah petunjuk yang hilang di sisiku. Pemasangan /procdi chroot saya berhasil.
Tino
3

Tampaknya Anda perlu menambahkan

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

ke /etc/ld.so.conf, atau lebih mungkin ke file baru di /etc/ld.so.conf.d. Kemudian jalankan ldconfiguntuk memperbarui cache sehingga lddakan menemukan perpustakaan.

Untuk skrip chroot, dalam jangka panjang Anda mungkin akan lebih sedikit kesusahan untuk mengambil pendekatan berbasis paket, membuat instalasi basis terlebih dahulu (menggunakan mis. Debootstrap pada host berbasis Debian), kemudian menginstal paket yang Anda inginkan. Itu memungkinkan manajer paket menangani semua pekerjaan menyelesaikan dependensi, menginstal semua file yang diperlukan, dan menjalankan tugas-tugas postinstall.

Andrew Schulman
sumber
Dan bisakah Anda memberi tahu saya mengapa itu tidak ada di ld.so.conf atau salah satu file yang disertakan? Haruskah OS meletakkannya di sana selama instalasi?
Rip Leeb
Tidak, saya tidak tahu itu. Saya dapat mengatakan bahwa saya melihat hasil yang sama pada host Ubuntu 14.04 saya, dan java mulai baik-baik saja. Jadi itu harus menyelesaikan ketergantungan secara dinamis saat dijalankan.
Andrew Schulman