我正在编写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
。显然,这是一个已知的依赖关系,但是路径是未知的吗?任何帮助表示赞赏!