在Debian上启动java的问题:“加载共享库时出错:libjli.so”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Debian上启动java的问题:“加载共享库时出错:libjli.so”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3216字,纯文字阅读大概需要5分钟。
内容图文
![在Debian上启动java的问题:“加载共享库时出错:libjli.so”](/upload/InfoBanner/zyjiaocheng/739/7b80203d77514b379c2086a94a7cffc1.jpg)
我正在尝试启动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)
UPD:
/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
UPD2:
我也试过设置root 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中查找库.这里的rpath是$ORIGIN /../ lib / i386 / jli:$ORIGIN /../ jre / lib / i386 / jli.通常$ORIGIN应该被可执行文件的位置替换,这里是/usr/lib / jvm / java-6-openjdk / jre / bin.
这里,$ORIGIN没有被替换.在具有额外特权(setuid,setgid或setpcap)的可执行文件中关闭该功能,因为否则您可能能够注入不同的库,因此可以使用提升的权限运行任意代码. (有关更详细的说明,请参阅this article.)安全问题最近才被发现;在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用户身份运行但不像其他用户那样工作可能会很有用,而且事实证明您调用的是不同的二进制文件.)
我敢打赌你早先在你的PATH上有一些其他java版本(sudo更改了PATH).检查java所说的类型 – 它可能是一些不同的Java版本,ldd / path / to / bin / java报告了libjli.so =>未找到.
我猜测这个Java版本找不到libjli.so的原因是它正在通过rpath(存储在可执行文件中的库搜索路径)来查找它,它与它的安装方式不匹配.如果在/ some / where / bin / java中有java二进制文件,并且它有一个相对rpath(这是Sun JDK和OpenJDK的方式),那么库应该在/ some / where / lib / i386 / jli中/libjli.so(假设是i386架构).如果rpath是绝对的,则需要将libjli.so放在指定的确切位置,或者将LD_LIBRARY_PATH设置为包含libjli.so所在的位置.
内容总结
以上是互联网集市为您收集整理的在Debian上启动java的问题:“加载共享库时出错:libjli.so”全部内容,希望文章能够帮你解决在Debian上启动java的问题:“加载共享库时出错:libjli.so”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。