[unix] 데비안에서 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)

UPD :

/ usr / lib / jvm / java-6-openjdk / jre / bin / 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

UPD2 :

루트 PATH를 설정하려고했습니다.

$ 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 :

나는 노력했다 :

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

뿌리 아래. 그러나 Java에 사용 가능한 환경 변수는 없습니다.

UPD4 :

strace -f java -version결과 : http://dumpz.org/67368/



답변

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/java그리고 setcap -r …어떤 경우 기능을 제거하기 위해).


(원본 대답 java은 루트로 작동하지만 다른 사용자로 는 작동하지 않으며 다른 바이너리를 호출하는 경우 유용합니다 .)

내 내기는 java이전에 다른 버전 이 있다는 것입니다 PATH(을 sudo변경하십시오 PATH). 내용을 확인하십시오 . 보고서 type java와 다른 Java 버전 일 수 있습니다.ldd /path/to/bin/javalibjli.so => not found

그리고이 Java 버전을 찾을 수없는 이유 libjli.so는 설치 방법과 일치하지 않는 rpath (실행 파일에 저장된 라이브러리 검색 경로)를 통해 찾고 있기 때문입니다. 에 java바이너리 /some/where/bin/java가 있고 상대 경로 (Sun JDK 및 OpenJDK의 방식)가있는 경우 라이브러리가 있어야합니다 /some/where/lib/i386/jli/libjli.so(i386 아키텍처 가정). rpath가 절대적이면 libjli.so정확한 위치를 지정하거나 LD_LIBRARY_PATHwhere를 포함하도록 설정 해야합니다 libjli.so.


답변

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

좋다


답변

동일한 경로에서 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.


답변

Java 실행 파일에서 setcap을 사용하여 버그가 발생한 경우

Oracle Java 7을 setcap cap_net_bind_service + ep

http://bugs.java.com/view_bug.do?bug_id=7157699 와 함께 작동시키는 방법

이 질문에 대해 자세히 대답합니다.

추신. 우리 프로젝트에서 우리는

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

Java 바이너리가 1024 미만의 tcp / udp 포트를 열 수있게합니다. 위의 “bug”위의 7157699는 libjli.so가 /etc/ld.so.conf.d 경로의 conf 파일에있는 디렉토리를 추가하여 빠른 솔루션을 제공합니다. 라이브러리를 다시 캐시하기 위해 ldconfig 호출 리눅스를 가정.


답변

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


답변

Tshepang의 답변과 비슷하게 libjli.so도서관 검색 경로를 강요 했습니다.

# 찾기 / 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

참고로, 빌드 환경은 Ubuntu 10.04 / 64-bit에서 github : flexiondotorg / oab-java6을 사용합니다.


답변

이상한 이유로 /usr/bin/java더 이상 Java 설치를 가리 키지 않았습니다. 어떻게 된건 지 모르겠습니다. 나는 이것을 실행하여 이것을 확인했다 :

$ sudo update-alternatives --config java

나에게 다음을 주었다

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

그래서 해결책은 자바를 제거하고 /usr/local/bin새로운 심볼릭 링크를 만드는 것입니다.

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