2011-11-04 70 views
6

以下是我遇到的情景:chroot如何影响动态链接?

我创建了debootstrap ubuntu特立独行(64位)环境。我把它放在我的ubuntu(64位)清晰系统上的/env/mav/。我可以将chroot分成/env/mav,并且可以完美地利用特立独行的系统。

我甚至可以在chrooted环境外使用lucid程序。那就是/env/mav/bin/ls会运行。

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

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

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15 

但是,很明显,如果我chroot/env/mav,每个程序都运行良好。并不是所有的图书馆都只是从监狱里读取(/env/mav/lib?那么在这种情况下chroot和修改LD_LIBRARY_PATH有什么区别?

而且,如果我:

mount -B /env /env/mav/env 

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

我不知道内部会发生什么。是否有某些ld内部存储在某处? chroot做了些神奇的事情吗?

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

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

回答

6

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

所以,当你运行

LD_LIBRARY_PATH=/env/mav/ /env/mav/bin/ls 

根系统的/lib/ld-linux.so.2将被使用,那么它会尝试使用$LD_LIBRARY_PATH环境变量(你可以看看有什么解决动态库goind使用LD_DEBUG=all env变量)

而当你做一个chroot时,将使用特立独行者的/lib/ld-linux.so.2。我认为,主机系统的ld-linux和guest(maverick)系统的libc.so(因为ld-linux是glibc/eglibc包的一部分,它使用libc.so中的某些内容)之间可能存在一些不兼容问题。

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

LD_LIBRARY_PATH=/env/mav/ /env/mav/lib/ld-linux.so.2 /env/mav/bin/ls 

在这里,我尝试手动启动客人的LD-linux下,以覆盖INTREP硬编码路径(是的,这运行一个.so库看起来很不寻常,但是这个库是非常特殊的情况并且允许这种语法)。如果这个命令行得通,我的假设可能会很好。如果没有,还有其他解释可能。

+0

感谢您对linux连接系统如何工作的解释。完美工作。 – UsAaR33

+4

发现将libpthread.so链接到libc.so(使用LD_DEBUG)时发生崩溃。值得注意的是,来自未来的人ld.so --list允许你用不同的连接器进行ldd。 – UsAaR33