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

Rip*_*eeb 8 debian java dependencies jdk

我正在编写 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
Run Code Online (Sandbox Code Playgroud)

这对 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)
Run Code Online (Sandbox Code Playgroud)

我找到了文件...

$ 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rey 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 条目可执行程序。

我被它咬了多少次,不得不重新发现它?哦,强大而聪明的谷歌,下次快点带我回到这里,让未来的我可以在过去的我膝盖上重新学习!


小智 3

看来你需要添加

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli
Run Code Online (Sandbox Code Playgroud)

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

对于编写 chroot 脚本,从长远来看,采用基于软件包的方法可能会减轻您的痛苦,首先创建基本安装(例如在基于 Debian 的主机上使用 debootstrap),然后安装您想要的软件包。这使得包管理器可以处理解决依赖关系、安装所有需要的文件以及运行安装后任务的所有工作。