以下是我所拥有的情景:
我创建了一个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"毒药"一切;使用其他特立独行的库目录没有问题。
答案 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
库似乎相当不寻常,但这个库是非常特殊的情况并且允许这个句法)。如果这个命令有效,我的假设可能会很好。如果没有,还有其他解释可能。