Atl*_*s1j 14 linker shared-libraries
LD_PRELOAD_PATH和LD_LIBRARY_PATH之间有什么区别?
我理解他们的所作所为,但不了解他们的不同之处.
来自 http://en.wikipedia.org/wiki/Dynamic_linker
在程序执行或程序链接期间,可以影响动态链接器修改其行为.可以在各种类Unix系统的运行时链接器手册页中看到这方面的示例.此行为的典型修改是使用LD_LIBRARY_PATH和LD_PRELOAD环境变量.这些变量通过在备用位置搜索共享库并强制加载和链接原本不存在的库来调整运行时链接过程.
特别是我对Linux中存在LD_PRELOAD_PATH和LD_LIBRARY_PATH的区别感兴趣:
hob*_*bbs 19
LD_PRELOAD(not LD_PRELOAD_PATH)是在任何其他库之前加载的特定库(文件)的列表,无论程序是否需要它.LD_LIBRARY_PATH是加载本来应该加载的库时要搜索的目录列表.在linux上,您可以阅读man ld.so有关影响动态链接器的这些和其他环境变量的更多信息.
hac*_*rb9 10
最重要的区别是 LD_PRELOAD 可以替换静态链接到二进制文件中的函数。
如果您发现 LD_PRELOAD 适合您,但 LD_LIBRARY_PATH 神秘地不适合您,那么几乎可以肯定,这就是原因。
例如,我正在调试GNU Readline,一bash开始很困惑为什么我修改后的 libreadline.so 使用 LD_PRELOAD 加载,而不是 LD_LIBRARY_PATH。
$ LD_PRELOAD=shlib/libreadline.so bash -
(worked)
$ LD_LIBRARY_PATH=shlib/ bash -
(failed)
Run Code Online (Sandbox Code Playgroud)
使用ldd命令查看一下,它列出了动态链接库的依赖关系,给出了答案:
$ LD_PRELOAD=shlib/libreadline.so bash -
(worked)
$ LD_LIBRARY_PATH=shlib/ bash -
(failed)
Run Code Online (Sandbox Code Playgroud)
果然,libreadline 没有被列为共享库之一。因此,我的机器上的 /bin/bash 必须在编译时与它自己的 libreadline 版本静态链接。LD_LIBRARY_PATH 不起作用的原因是二进制文件从不要求动态链接器 (ld.so) 加载 libreadline。
另一方面,LD_PRELOAD 无论如何都会加载库,允许库覆盖甚至静态链接的函数。
| 归档时间: |
|
| 查看次数: |
7894 次 |
| 最近记录: |