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"毒药"的一切; 使用其他特立独行的库目录没有问题.
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库,但这个库是非常特殊的情况并允许这种语法).如果这个命令有效,我的假设可能会很好.如果没有,还有其他解释可能.
| 归档时间: |
|
| 查看次数: |
2150 次 |
| 最近记录: |