DebianでJavaを起動すると問題が発生しました:「共有ライブラリのロードエラー:libjli.so」

DebianでJavaを起動すると問題が発生しました:「共有ライブラリのロードエラー:libjli.so」

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

しかし、Javaは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)

修正する:

/usr/lib/jvm/java-6-openjdk/jre/bin/javaは実際に私のJavaコマンドです。

$ 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

アップデート2:

また、ルートパスを設定しようとしました。

$ 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

アップデート3:

私は試した:

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

根の下。ただし、Javaには使用可能な環境変数はありません。

UPD4:

strace -f java -version結果:http://dumpz.org/67368/

ベストアンサー1

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

実行中の実行可能ファイルは、次の場所でライブラリを探します。汎用ライブラリの検索パスに追加されます。ここで、rpath$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli$ORIGIN通常、実行可能ファイルの場所に置き換える必要があります。ここではです/usr/lib/jvm/java-6-openjdk/jre/bin

ここにあります、$ORIGIN交換されません。この機能は、追加の権限(setuid、setgid、またはsetpcap)で実行される実行可能ファイルではオフになります。それ以外の場合は、別のライブラリを挿入して、昇格した権限で任意のコードを実行できるためです。 (よりこの記事より詳細な説明が必要です。 ) セキュリティ問題は最近発見され、Debian で修正されました。DSA-2122-1にアップグレードする前に、実行可能libc6-2.7-18lenny6ファイルjavaが動作していた可能性があります。

この症状は、追加javaの権限で実行中であることを示します。一般的な Debian インストールではこれは発生しません。/usr/lib/jvm/java-6-openjdk/jre/bin/javaモードが755で機能がないことを確認してください(およびgetcap /usr/lib/jvm/java-6-openjdk/jre/bin/java機能setcap -r …がある場合は削除)。


java(元の答え、これはrootとして機能しますが、他のユーザーとしては機能せず、別のバイナリを呼び出す場合に便利です。)

あなたの(変更)java以前に別のバージョンがあったでしょう。内容を確認してください。報告されたJavaバージョンが異なる場合があります。PATHsudoPATHtype javaldd /path/to/bin/javalibjli.so => not found

このJavaバージョンが見つからない理由は、libjli.sorpath(実行ファイルに格納されたライブラリ検索パス)を介して探しているためだと推測されます。これはインストールされた方法と一致しません。javaバイナリが存在し、/some/where/bin/java相対rpath(Sun JDKやOpenJDKと同じ方法)がある場合、ライブラリは/some/where/lib/i386/jli/libjli.so(i386アーキテクチャの前提条件)に存在する必要があります。 rpathが絶対パスの場合は、libjli.so正確に指定された場所に配置するか、そのLD_LIBRARY_PATH場所を含めるように設定する必要がありますlibjli.so

おすすめ記事