Masalah untuk meluncurkan java di Debian: “kesalahan saat memuat pustaka bersama: libjli.so”

16

Saya mencoba meluncurkan java:

$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

$ ldd /usr/lib/jvm/java-6-openjdk/jre/bin/java
        linux-gate.so.1 =>  (0xb779f000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7780000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000)
        libjli.so => /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
        /lib/ld-linux.so.2 (0xb77a0000
$ ls /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/
libjli.so

Tetapi java bekerja di bawah root:

$ sudo java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~lenny1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)

UPD:

/ usr / lib / jvm / java-6-openjdk / jre / bin / java sebenarnya adalah perintah java saya:

$ type java
java is hashed (/usr/bin/java)
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 14 10:15 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Jul 14 10:36 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java

UPD2:

Saya juga mencoba mengatur PATH root:

$ sudo su
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

UPD3:

Saya sudah mencoba:

# comm -3 <(declare | sort) <(declare -f | sort)

di bawah root. Tetapi tidak ada variabel lingkungan yang dapat digunakan untuk java.

UPD4:

strace -f java -versionhasil: http://dumpz.org/67368/

Aetaur
sumber
Silakan jalankan strace -f java -versiondan kirim hasilnya.
Gilles 'SANGAT berhenti menjadi jahat'
Ini adalah hasil strace: dumpz.org/67368
aetaur

Jawaban:

12
open("$ORIGIN/../lib/i386/jli/tls/i686/sse2/cmov/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)

Executable Anda menjalankan penampilan untuk perpustakaan di rPath di samping jalur pencarian perpustakaan normal. Permusuhan di sini adalah $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli. Biasanya $ORIGINharus diganti dengan lokasi yang dapat dieksekusi, di sini /usr/lib/jvm/java-6-openjdk/jre/bin.

Di sini, $ORIGINtidak diganti. Fitur ini dimatikan dalam executable yang berjalan dengan hak istimewa tambahan (setuid, setgid, atau setpcap), karena jika tidak, Anda mungkin dapat menyuntikkan pustaka yang berbeda dan menjalankan kode arbitrer dengan hak istimewa yang ditingkatkan. (Lihat artikel ini untuk penjelasan lebih rinci.) Masalah keamanan ditemukan relatif baru-baru ini; di Debian itu diperbaiki di DSA-2122-1 , jadi sebelum Anda memutakhirkan ke libc6-2.7-18lenny6, javaexecutable Anda mungkin akan bekerja.

Gejala menunjukkan bahwa javaini berjalan dengan hak istimewa tambahan. Ini bukan kasus di instalasi Debian normal. Pastikan itu /usr/lib/jvm/java-6-openjdk/jre/bin/javaadalah mode 755 dan tidak memiliki kapabilitas ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java, dan setcap -r …untuk menghapus kapabilitas jika ada).


(Jawaban orisinal, yang mungkin berguna jika Anda menemukan bahwa itu javaberfungsi sebagai root tetapi tidak sebagai pengguna lain, dan ternyata Anda memanggil binari yang berbeda.)

Taruhan saya adalah bahwa Anda memiliki beberapa javaversi lain sebelumnya di PATH( sudomengubah PATH). Periksa apa yang type javadikatakan - itu mungkin beberapa versi Java yang berbeda untuk ldd /path/to/bin/javalaporan mana libjli.so => not found.

Dan saya berspekulasi bahwa alasan yang tidak dapat ditemukan oleh versi Java ini libjli.soadalah bahwa ia mencarinya melalui rpath (jalur pencarian pustaka yang disimpan di executable) yang tidak cocok dengan cara pemasangannya. Jika Anda memiliki javabiner di /some/where/bin/javadalamnya, dan ia memiliki jalur relatif (yang merupakan jalan dari Sun JDK dan OpenJDK), perpustakaan harus berada dalam /some/where/lib/i386/jli/libjli.so(dengan asumsi arsitektur i386). Jika rpath absolut, Anda harus memasukkan libjli.solokasi yang ditentukan dengan tepat, atau mengatur LD_LIBRARY_PATHuntuk menyertakan di mana libjli.so.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya telah memperbarui awalnya posting - ldd / path / ke / bin / java sebenarnyatype java
aetaur
Saya mencoba untuk mengatur PATH root dan export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/, tetapi mendapat kesalahan yang sama.
aetaur
Ok, saya kehilangan taruhan saya. Tampaknya java executable Anda memiliki hak istimewa tambahan, yang aneh.
Gilles 'SO- berhenti bersikap jahat'
4

Saya mengunduh "1.7.0_60" dari java.com dalam .tar.gzformat dan memasangnya /usr/local/jre1.7.0_60. Saya kemudian membuat tautan keras ke /usr/local/bin/javadan menerima kesalahan yang dijelaskan di atas.

Mengubah hardlink ke tautan simbolik memperbaiki masalah.

Versi pendek:

$ sudo ln /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

Buruk.

$ sudo ln -s /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

Bagus

Lewat acak.
sumber
2

Cobalah untuk menemukan executable java di dalam jalur yang sama libjli.sodan gunakan itu.

Misalnya saya temukan libjli.sodi /usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so, jadi saya gunakan

find /usr/lib/jvm/java-7-oracle/ -name "java"

dan menemukan executable di /usr/lib/jvm/java-7-oracle/bin/java. Kemudian, saya dihapus javadari /usr/bindan hanya symlinked atas ke executable /usr/bin.

demonkoryu
sumber
2

Jika bug disebabkan oleh penggunaan setcap pada Java yang dapat dieksekusi, maka lihat

Cara mendapatkan Oracle Java 7 agar berfungsi dengan setcap cap_net_bind_service + ep dan http://bugs.java.com/view_bug.do?bug_id=7157699

yang menjawab pertanyaan ini secara terperinci.

ps. Dalam proyek kami, kami harus melakukannya

sudo setcap cap_net_bind_service=+ep /path/to/java

untuk mengizinkan java binary untuk membuka port tcp / udp di bawah 1024. Di atas java "bug" 7157699 menyediakan solusi cepat, dengan menambahkan direktori di mana libjli.so berada dalam file conf di path /etc/ld.so.conf.d lalu memanggil ldconfig untuk me-cache kembali perpustakaan. Dengan asumsi Linux.

Tagar
sumber
0

Periksa izin pada file itu. Mereka seharusnya terlihat seperti 0644/-rw-r--r--. Jika tidak, instal ulang openjdk-6-jre-headless, karena itu berarti seseorang mengacaukan izin.

tepang
sumber
1
lddakan melaporkan libjli.so => not foundjika tidak dapat membaca .so(setidaknya itulah yang terjadi dengan GLibc 2.11).
Gilles 'SO- stop being evil'
0

Mirip dengan jawaban Tshepang, saya dipaksa libjli.somasuk ke jalur pencarian perpustakaan:

# find / usr / lib / jvm -name \ libjli.so
/usr/lib/jvm/java-6-sun-1.6.0.45/jre/lib/amd64/jli/libjli.so

# export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-sun / jre / lib / amd64 / jli: $ LD_LIBRARY_PATH


Sebagai referensi, lingkungan build saya menggunakan github: flexiondotorg / oab-java6 di Ubuntu 10.04 / 64-bit.

chronospoon
sumber
0

Untuk beberapa alasan aneh /usr/bin/javatidak lagi menunjuk ke instalasi java. Tidak tahu bagaimana ini terjadi. Saya mengkonfirmasi ini dengan menjalankan:

$ sudo update-alternatives --config java

Yang memberi saya yang berikut

There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
Nothing to configure.
update-alternatives: warning: forcing reinstallation of alternative /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java because link group java is broken
update-alternatives: warning: not replacing /usr/bin/java with a link

Jadi solusinya adalah menghapus java di /usr/local/bindan membuat symlink baru:

$ sudo rm -rf /usr/bin/java
$ sudo ln -s /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java /usr/bin/java
Daithí
sumber
0

Saya memiliki kesalahan yang sama.

Cara termudah untuk menyelesaikannya adalah dengan menghapus semua jdks dan jres dan juga executable / usr / bin / java, jika ada.

Dan kemudian instal ulang jdk.

Itu memecahkan masalah bagi saya. Sementara metode lain tidak.

Daniyal Yasin
sumber
0

Bagi siapa pun yang mencoba memulai aplikasi Java dari layanan systemd dan mendapatkan kesalahan yang sama, terkait dengan libjli.soperpustakaan, baca terus.

Ada bug terbuka untuk ini untuk Fedora saat ini:

Bug 1358476 - SELinux mencegah systemd dari mengeksekusi layanan berbasis java

Hasilnya adalah SELinux secara diam - diam membatasi akses ke perpustakaan itu. Karena tidak ada pesan yang ditolak AVC, Anda tidak dapat memperbaikinya dengan konteks, atau perubahan kebijakan.

Saya telah menemukan bahwa menambahkan file /etc/ld.so.conf.d/yang berisi folder libjli.sofile Anda adalah satu solusi:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-5.b14.fc26.x86_64/jre/lib/amd64/jli/

Dan kemudian jalankan

ldconfig

Tapi itu cukup berantakan ...

Opsi yang lebih baik adalah menggunakan /bin/bash -cuntuk meluncurkan proses Java di file layanan Anda:

ExecStart=/bin/bash -c "/usr/bin/java -Xmx1024m -jar myApp.jar NONINTERACTIVE"

Sampai masalah ini diperbaiki ....

comfytoday
sumber
Haruskah begitu /bin/bash? Apa yang terjadi jika Anda menggunakan /bin/sh?
G-Man Mengatakan 'Reinstate Monica'
@ G-Man Apakah Anda mencobanya dengan / bin / sh? Saya kira itu juga akan berhasil tetapi Anda harus mencoba. Harap perbarui dengan bagaimana Anda menggunakannya. Terima kasih
comfytoday