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는 루트에서 작동합니다.

$ 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)으로 실행되는 실행 파일에서는 꺼집니다. 그렇지 않으면 다른 라이브러리를 삽입하여 상승된 권한으로 임의 코드를 실행할 수 있기 때문입니다. (보다이 기사더 자세한 설명을 원하시면. ) 보안 문제는 최근에야 발견되었으며 데비안에서는 수정되었습니다.DSA-2122-1로 업그레이드하기 전에 실행 libc6-2.7-18lenny6파일 java이 작동 중이었을 수 있습니다 .

이 증상은 java추가 권한으로 실행 중임을 나타냅니다. 일반적인 데비안 설치에서는 이런 일이 발생하지 않습니다. /usr/lib/jvm/java-6-openjdk/jre/bin/java모드가 755이고 기능이 없는지 확인하십시오 ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/javasetcap -r …기능이 있는 경우 제거).


java(원래 답변, 이는 루트로 작동하지만 다른 사용자로는 작동하지 않고 다른 바이너리를 호출하는 경우 유용할 수 있습니다.)

귀하의 (변경) 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.

답변2

java.com에서 "1.7.0_60" .tar.gz형식을 다운로드하여 에 설치했습니다 /usr/local/jre1.7.0_60. 그런 다음 하드 링크를 생성했는데 /usr/local/bin/java위의 오류가 발생했습니다.

하드 링크를 심볼릭 링크로 변경하면 문제가 해결되었습니다.

간결한 버전:

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

안좋다.

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

매우 좋은.

답변3

동일한 경로에서 Java 실행 파일을 찾아 libjli.so사용해 보십시오.

예를 들어 나는 찾았 libjli.so으므로 /usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so다음을 사용했습니다.

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

에서 실행 파일을 찾았습니다 /usr/lib/jvm/java-7-oracle/bin/java. 그런 다음 java위의 /usr/bin실행 파일을 삭제하고 /usr/bin.

답변4

파일의 권한을 확인하십시오. 그들은 다음과 같아야 합니다 0644/-rw-r--r--. 그렇지 않은 경우 다시 설치하십시오.openjdk-6-jre-headless, 누군가가 권한을 엉망으로 만들었다는 의미이기 때문입니다.

관련 정보