我有一个 Linux 内核,我将其 chroot 为/var/chroot
:
我bash
像这样添加了依赖项:
ldd /bin/bash
linux-vdso.so.1 => (0x00007fff9a373000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f24d57af000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f24d55ab000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f24d51eb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f24d59f8000)
然后我做了:
# cd /var/chroot/
# mkdir bin/ lib64/ lib/
# cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/
# cp /lib/x86_64-linux-gnu/libdl.so.2 lib/
# cp /lib/x86_64-linux-gnu/libc.so.6 lib/
# cp /lib64/ld-linux-x86-64.so.2 lib64/
# cp /bin/bash bin/
在那之后:
# chroot /var/chroot
之后我复制/bin/ls
了ldd ls
.但是当我运行时ls
出现以下错误:
ls: error while loading shared libraries: libpthread.so.0: wrong ELF class: ELFCLASS32
答案1
由于您显然能够启动 bash,因此您已经掌握了正确的基础知识:您需要将列出的所有库复制ldd /bin/command
到库加载路径,加上加载程序本身 ( /lib64/ld-linux-x86-64.so.2
),它需要位于可执行文件中硬编码的位置。
如果出现错误
error while loading shared libraries: libc.so.6: cannot open shared object file
那么你就错过了这里指出的图书馆。检查是否将其以正确的名称放置在正确的目录中。检查您是否复制了库文件,而不仅仅是其符号链接。
如果出现错误
ls: error while loading shared libraries: libpthread.so.0: wrong ELF class: ELFCLASS32
然后您复制了错误架构的库 - 您必须复制 32 位的库libpthread.so.0
,但您运行的是 64 位库。
如果您遇到其他问题,找出加载程序尝试查找库的确切位置可能会有所帮助。放一个strace
chroot 中的二进制文件(静态编译的二进制文件,或动态编译的二进制文件加上它需要的所有库),然后运行chroot ls
并查看到底发生了什么故障。或者运行strace chroot ls
以使用strace
chroot 之外的二进制文件。
答案2
小心。共享库文件通常是符号链接的。这样可以更改当前版本,并且所有已安装的应用程序仍然可以找到它。例如,在我的系统上:
ls -l /usr/lib/libc.so.6
lrwxrwxrwx 1 root root 12 dec 27 03:13 /usr/lib/libc.so.6 -> libc-2.20.so*
所以libc.so.6
实际上指向当前的libc版本,当我更新系统时,它将指向新版本,无论它是什么。通常存在多个级别的链接。
您需要复制实际的库,而不仅仅是链接。
答案3
尝试
mkdir lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libtinfo.so.5 /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu
如果您想使用像 ls 这样的命令,您还必须ldd /bin/ls
复制库文件。
顺便说一句,cp
将复制符号链接的内容。