Java JDK在依赖项列表,Debian中缺少libjli.so路径


8

我正在编写chroot监狱的脚本,自动化的一部分包括将各种可执行文件及其依赖项复制到监狱中。我正在使用以下bash行从依赖项列表中解析文件路径(例如,对于Java):

$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

这对Node.js和Python很好用,但是当我尝试java从监狱执行时,出现错误:

java:加载共享库时出错:libjli.so:无法打开共享库文件:没有这样的文件或目录

事实证明,依赖项列表中缺少libjli.so路径……至少那些ldd向我们展示的依赖项(第5行):

$ ldd `which java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

我找到了文件...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

...但是我想知道为什么没有列出ldd。显然,这是一个已知的依赖关系,但是路径是未知的吗?任何帮助表示赞赏!


有趣的问题,您可以尝试在openjdk论坛上提问。
Faheem Mitha 2014年

万一有人偶然发现谷歌的话:好像是unix.stackexchange.com/questions/16656的副本,其中包含更多信息(和不同的答案)。
yshavit 2015年

Answers:


7

它应该开箱即用-不会与/etc/ld.so.conf*或ldconfig混为一谈,并且可以轻松地做到这一点。只需在您的chroot中挂载/ proc。我使用实根fs中的/ etc / fstab中的以下行来执行此操作:

/ proc / var / chroot / ia32 / proc无绑定

因此将其绑定到实际的/ proc。

根据https://github.com/cedric-vincent/PRoot/issues/9,ld-linux.so(我想是)通过查看/ proc / self /确定$ ORIGIN替代objdump -p的RPATH条目可执行程序。

我被这个问题咬了多少次,不得不重新发现它?哦,强大而明智的Google,下一次将我迅速带回这里,以便将来我可以在过去我的膝盖上再次学习!


1
谢谢。您所指的/proc/self/exe是我身边缺少的线索。安装/proc在我的chroot中可以解决问题。
蒂诺2015年

3

似乎您需要添加

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

到/etc/ld.so.conf,或更可能是/etc/ld.so.conf.d中的新文件。然后运行ldconfig以更新缓存,以便ldd找到该库。

对于使用chroot脚本,从长远来看,采用基于软件包的方法可能会减轻痛苦,首先创建一个基础安装(例如,在基于Debian的主机上使用debootstrap),然后安装所需的软件包。这样,程序包管理器就可以完成解决依赖关系,安装所有必需文件以及运行安装后任务的所有工作。


并且您能告诉我为什么它不在ld.so.conf或包含的文件之一中吗?操作系统应该在安装过程中将其放在那里吗?
Rip Leeb 2014年

不,我不知道。我可以说我在Ubuntu 14.04主机上看到了相同的结果,但是java启动正常。因此,它必须在运行时动态地解决依赖关系。
安德鲁·舒尔曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.