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バージョンが異なる場合があります。PATH
sudo
PATH
type java
ldd /path/to/bin/java
libjli.so => not found
このJavaバージョンが見つからない理由は、libjli.so
rpath(実行ファイルに格納されたライブラリ検索パス)を介して探しているためだと推測されます。これはインストールされた方法と一致しません。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
。