6

这是我遇到的情况:

我创建了一个 debootstrap ubuntu 特立独行(64 位)环境。我把它/env/mav/放在我的 ubuntu(64 位)Lucid 系统上。我可以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] 用例是运行从maverick 环境正确绑定到maverick 监狱外的maverick 动态链接库的程序。

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

4

1 回答 1

7

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 将被使用,然后它将尝试使用 env 变量解析动态库$LD_LIBRARY_PATH(您可以使用 env 变量查看发生了什么LD_DEBUG=all

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

ld-linux我认为,主机系统和来宾(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,但这个库是非常特殊的情况,允许使用这种语法)。如果这个命令有效,我的假设可能是好的。如果不是,还有其他可能的解释。

于 2011-11-04T02:44:32.140 回答