chroot如何影响动态链接?

UsA*_*R33 6 ubuntu linker chroot ld

这是我的场景:

我创建了一个debootstrap ubuntu maverick(64位)环境.我将它/env/mav/放在我的ubuntu(64位)清晰系统上.我可以chroot进入/env/mav,可以完美地利用特立独行系统.

我甚至可以在chrooted环境之外使用清晰的程序.那/env/mav/bin/ls将是运行.

但是,我注意到如果我修改LD_LIBRARY_PATH/env/mav/lib[1] [2]

我运行的每一个程序(清醒和特立独行)都会立即崩溃.(例如ls导致段错误).kern.log显示:

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15
Run Code Online (Sandbox Code Playgroud)

但是,如果我chroot进入/env/mav,每个程序运行正常.并不是所有的库都只是从jailed(/env/mav)中读取的/lib?那么在这种情况下有什么区别chroot和修改LD_LIBRARY_PATH呢?

此外,如果我:

mount -B /env /env/mav/env
Run Code Online (Sandbox Code Playgroud)

然后chroot /env然后设置LD_LIBRARY_PATH/env/mav/lib,一切仍然运行良好.

我对这里内部发生​​的事情感到茫然.是否有某些ld内部存储在某处?chroot是否做了一些神奇的事情?

[1]用例是从正确绑定的特立独行环境中运行程序,以便在特立独行的监狱外设置动态链接库.

[2]这只是一个简略的例子.实际上/usr/lib,等等都包括在内.包括特立独行的环境/ lib"毒药"的一切; 使用其他特立独行的库目录没有问题.

osg*_*sgx 6

LD_LIBRARY_PATH是ld-linux.so程序/库的选项.该库是一个动态链接器.它的路径" /lib/ld-linux.so.2"在(几乎)所有动态链接的程序中硬编码在ubuntu中的ELF头文件(INTREP字段)中.我的意思是,当Linux内核运行二进制文件时,它对LD_LIBRARY_PATH的特殊含义一无所知.

所以,当你跑步

 LD_LIBRARY_PATH=/env/mav/ /env/mav/bin/ls
Run Code Online (Sandbox Code Playgroud)

将使用根系统的/lib/ld-linux.so.2然后它将尝试使用$LD_LIBRARY_PATHenv变量解析动态库(您可以使用env变量查看goind是什么LD_DEBUG=all)

当你做chroot时,/lib/ld-linux.so.2将使用特立独行的.

我认为,主机系统ld-linux和客户(特立独行)系统之间可能存在一些不兼容性libc.so(因为ld-linux是glibc/eglibc包的一部分,它使用来自libc.so的东西).

为了测试我的假设,尝试运行(env变量设置的bash语法):

 LD_LIBRARY_PATH=/env/mav/ /env/mav/lib/ld-linux.so.2 /env/mav/bin/ls
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试手动启动guest的ld-linux,以覆盖INTREP硬编码路径(是的,这似乎很不寻常运行.so库,但这个库是非常特殊的情况并允许这种语法).如果这个命令有效,我的假设可能会很好.如果没有,还有其他解释可能.

  • 通过将libpthread.so链接到libc.so(使用LD_DEBUG),可以解决崩溃问题.值得注意的是,未来的人,ld.so --list,允许你用不同的连接器做ldd. (4认同)