加载共享库时出错:libc.so.6:无法打开共享对象文件

加载共享库时出错:libc.so.6:无法打开共享对象文件

我有一个 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/lsldd 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 位库。

如果您遇到其他问题,找出加载程序尝试查找库的确切位置可能会有所帮助。放一个stracechroot 中的二进制文件(静态编译的二进制文件,或动态编译的二进制文件加上它需要的所有库),然后运行chroot ls并查看到底发生了什么故障。或者运行strace chroot ls以使用stracechroot 之外的二进制文件。

答案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将复制符号链接的内容。

相关内容