chroot如何影响动态链接?

时间:2011-11-04 01:58:48

标签: ubuntu linker ld chroot

以下是我所拥有的情景:

我创建了一个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

但是,很明显,如果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等都包括在内。包括特立独行的环境&#s; lib"毒药"一切;使用其他特立独行的库目录没有问题。

1 个答案:

答案 0 :(得分: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

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

当你做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

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