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)

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

在根下.但是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所在的位置.

标签:dynamic-linking,java,debian,permissions

来源: https://codeday.me/bug/20190809/1626460.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值