绝命中的一助linux程序加载器ld-linux.so中的LD_PRELOAD预加载库

来源:互联网 发布:手机淘宝 天天特价 编辑:程序博客网 时间:2024/05/02 19:08


偶然错误的将linux系统中的libc.so.6链接删除,导致busybox所有cmd命令失效,报load library error.最终的解决方法是采用预加载库的方式来解决这个问题:


LD_PRELOAD=/lib/libc-2.6.1.so ln -s /lib/libc-2.6.1.so libc.so.6
根据shell/exec加载elf程序的原理,是先解析ELF,定位并加载ld-linux.so这个程序加载器(该so路径需要通过ELF直接确定,且不依赖其他库),然后再解析elf中需要load的共享库,但这之前可以通过LD_PRELOAD来提前预先加载共享库,如果程序允许需要的未初始化symbol在预加载库中的话,就不会再load needed的共享库(如果预先加载的库也不满足运行需要,则继续根据编译时symbol所needed关系来load对应的so库,如果库查找后不存在就报load error。
预先加载so库的好处:避免了程序运行时所谓的库缺失,可以理解为是一种半自动的so加载过程,需要LD_PRELOAD变量来指定真实的库路径。当前,所有一切的功劳都是ld-linux的魅力所在。

0 0
原创粉丝点击