我有一个包含以下内容的目录:
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。
答案 0 :(得分:3)
加载器的位置(通常类似于/lib/ld-linux.so
)在二进制文件中是硬编码的。此组件没有搜索过程 - 如果找不到,则二进制文件根本不会运行。
(确切的路径取决于您正在使用的libc和架构。例如,它位于x /lib64/ld-linux-x86-64.so.2
上的glibc上。)
将在/etc/ld.so.conf
中配置要搜索动态库的位置。但是,如果您没有在chroot中拥有该文件,则可能无法配置某些标准路径!