【发布时间】:2014-10-05 17:36:00
【问题描述】:
我有一个目录,内容如下:
bin/busybox
lib/ld-linux.so.2
lib/libc.so.6
当我调用时:
chroot . bin/busybox sh
它失败了:
/bin/busybox: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
当我将 lib/libc.so.6 移动到 usr/lib 时,它工作正常。
为什么 libc 必须在 /usr/lib 中?当我调用时:
objcdump -p bin/busybox | grep NEEDED
我明白了:
NEEDED libc.so.6
所以我想,因为只有库的 soname 没有使用斜杠等。加载的将能够在标准文件夹中找到它,即 /lib 和 /usr/lib。显然,情况并非如此。
更令人困惑的是,ld-linux.so.2 似乎必须在 /lib 中,因为当它移动到 /usr/lib 时,chroot 失败并显示:
chroot: failed to run command '/bin/busybox': No such file or directory
我了解到的实际上是找不到加载程序的错误,而不是busybox二进制文件。
libc.so.2 发行版的问题是特定的吗?如果这很重要,我正在使用 Arch Linux。
【问题讨论】:
-
编译时设置LD_RUN_PATH,或者运行前导出LD_LIBRARY_PATH设置库搜索路径
-
或者做 ln -s /lib/libc.so.6 /usr/lib/libc.so.6
-
谢谢。这些是解决问题的方法(除了将文件保留在目录中以便一切正常),但不解释原始行为。
标签: linux archlinux libc chroot