LD_PRELOAD 变量
时间:2009-06-04
来源:互联网
有很多程序会用到这个变量:
aoss 用于使访问 oss 设备文件的程序转而访问 alsa 设备文件
sbox2 用于重新映射路径,建立一个伪装成本地系统的交叉编译环境
fakeroot 用于给普通用户伪装一个 root 权限环境,建立安装包的好助手
compiz 偶的 ati 卡需要执行 "LD_PRELOAD=/usr/lib/opengl/xorg-x11/lib/libGL.so compiz"才能启动,暂不明原因
checkinstall 等很多包管理器,用于截获文件系统操作,从而分析得到打包需要的文件列表
最近在琢磨:
能否用类似方法,完成一个在 x86_64 系统环境,不用执行 "linux32 chroot /x86_rootfs",直接执行 x86 程序的 程序。
或者已经有这样的软件包存在,只是还没被发现,dchroot、schroot是两个可疑目标。
原因如下:
multilib 系统环境,系统结构性复杂,吾恶之。
x86_64 系统环境下,用 linux32 chroot 结合 init,可以给出一个同时运行 x86_64 和 x86 两套系统的环境,但两套系统集成不如 multilib 系统,不能方便的在 x86_64 的桌面环境 启动 x86 的应用。
aoss 用于使访问 oss 设备文件的程序转而访问 alsa 设备文件
sbox2 用于重新映射路径,建立一个伪装成本地系统的交叉编译环境
fakeroot 用于给普通用户伪装一个 root 权限环境,建立安装包的好助手
compiz 偶的 ati 卡需要执行 "LD_PRELOAD=/usr/lib/opengl/xorg-x11/lib/libGL.so compiz"才能启动,暂不明原因
checkinstall 等很多包管理器,用于截获文件系统操作,从而分析得到打包需要的文件列表
最近在琢磨:
能否用类似方法,完成一个在 x86_64 系统环境,不用执行 "linux32 chroot /x86_rootfs",直接执行 x86 程序的 程序。
或者已经有这样的软件包存在,只是还没被发现,dchroot、schroot是两个可疑目标。
原因如下:
multilib 系统环境,系统结构性复杂,吾恶之。
x86_64 系统环境下,用 linux32 chroot 结合 init,可以给出一个同时运行 x86_64 和 x86 两套系统的环境,但两套系统集成不如 multilib 系统,不能方便的在 x86_64 的桌面环境 启动 x86 的应用。
作者: 聚焦深空 发布时间: 2009-06-04
http://en.wikipedia.org/wiki/Dynamic_linker
http://www.linuxsir.org/bbs/post264482-16.html
引用:
Unix and Unix-likes On Unix and Unix-like operating systems, the dynamic linker shared libraries vary. Two common ones are ld.so on BSD and ld-linux.so on Linux. These typically change their behaviour based on a common set of environment variables, including LD_LIBRARY_PATH and LD_PRELOAD. LD_PRELOAD LD_PRELOAD instructs the loader to load additional libraries into a program, beyond what was specified when it was compiled. It allows users to add or replace functionality when they run a program and can be used for beneficial purposes, such as implementing userspace virtual file systems or debuggers, or malicious purposes, to run code the program authors didn't intend. For this reason, LD_PRELOAD is often ignored when a program is running setuid and under a few other circumstances. More generally, this technique is called DLL injection. Examples of programs using LD_PRELOAD: authbind, IPv6 CARE, fakeroot. |
引用:
7.为应用程序提供动态转载服务。 环境变量LD_PRELOAD设置共享库名或者用":"把文件名隔开。动态连接器在 任何那些请求的共享库之前把环境变量LD_PRELOAD的共享库装载到进程地址 空间去。例如: # LD_PRELOAD=./mylibc.so myprog 这里./mylibc.so将第一时间map到程序myprog的空间。因为动态连接器在找 寻标号的时候总是使用第一次碰到的标号,所以我们可以使用LD_PRELOAD来 覆盖标准共享库中的函数。这个特性对程序员来说是很有用的,可用来在还 没有建好整个共享库的时候对单个函数功能先做调试实验。 我们可以这样: #gcc -c -fPIC -O3 print.c #gcc -shared print.o -o print.so.1.0 创建自己的共享连接库 |
作者: 聚焦深空 发布时间: 2009-06-04
谢谢,最近忽然对 LDFLAGS 也感兴趣,是否可以更前卫,带来更激进的效果?
作者: d00m3d 发布时间: 2009-06-13
LDFLAGS 讨论的满多的,不知还能不能玩出什么新花样。
看到好多人说 "-s" 是安全的,可以直接完成包括 库文件的 strip 动作,但看过 ld manpage 很难相信安全,有时间验证下。
偶上面是受 sbox2 和 qemu 用户空间模拟 启发,想做个类似程序。
x86 环境下,qemu-arm -L /arm-rootfs/lib/ld-linux.so.2 /arm-rootfs/bin/echo a 可以直接运行。
x86_64 环境下,qemu-i386 -L /i686-rootfs/lib/ld-linux.so.2 /i686-rootfs/bin/echo a 可以直接运行。
如果能把用户空间模拟去掉,会好很多。
x86_64 下直接用 i686 的 ld-linux.so 调用执行 i686 的动态连接程序是可行的,但要维护一大堆环境变量。
其实,偶是想在 x86_64 环境下直接运行 i686 的 wine,但又不想用静态连接版本。
看到好多人说 "-s" 是安全的,可以直接完成包括 库文件的 strip 动作,但看过 ld manpage 很难相信安全,有时间验证下。
偶上面是受 sbox2 和 qemu 用户空间模拟 启发,想做个类似程序。
x86 环境下,qemu-arm -L /arm-rootfs/lib/ld-linux.so.2 /arm-rootfs/bin/echo a 可以直接运行。
x86_64 环境下,qemu-i386 -L /i686-rootfs/lib/ld-linux.so.2 /i686-rootfs/bin/echo a 可以直接运行。
如果能把用户空间模拟去掉,会好很多。
x86_64 下直接用 i686 的 ld-linux.so 调用执行 i686 的动态连接程序是可行的,但要维护一大堆环境变量。
其实,偶是想在 x86_64 环境下直接运行 i686 的 wine,但又不想用静态连接版本。
作者: 聚焦深空 发布时间: 2009-06-13
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28