【问题标题】:What is the difference between LD_PRELOAD_PATH and LD_LIBRARY_PATH?LD_PRELOAD_PATH 和 LD_LIBRARY_PATH 有什么区别?
【发布时间】:2013-01-20 19:56:40
【问题描述】:

LD_PRELOAD_PATH 和 LD_LIBRARY_PATH 有什么区别?

我了解它们的作用,但不了解它们有何不同之处。

http://en.wikipedia.org/wiki/Dynamic_linker

可以影响动态链接器修改其行为 在程序执行或程序链接期间。 这方面的示例可以在运行时链接器手册页中看到 各种类 Unix 系统。一个典型的修改 这种行为是使用 LD_LIBRARY_PATH 和 LD_PRELOAD 环境变量。这些变量调整运行时链接 通过在备用位置搜索共享库和 通过强制加载和链接原本不会的库, 分别。

特别是,我对同时具有 LD_PRELOAD_PATH 和 LD_LIBRARY_PATH 的 Linux 中的差异感兴趣:

https://linuxgazette.net/issue48/tag/48.html

更新:这篇 1999 Linux Gazette 文章的作者在他 2013 年的评论中指出,公认的答案是 LD_PRELOAD_PATH 实际上并不存在。

【问题讨论】:

  • 您能否编辑这篇文章并将 LD_PRELOAD_PATH 更改为 LD_PRELOAD,尤其是在标题中?这可能会误导那些认为存在这样两个相似关键字的人。
  • 这样的编辑改变了问题的重点,即由于更早的 Linux Gazette 发布而似乎存在的两个特定环境变量的混淆。但是,我在问题中添加了文本,以确保读者理解这种情况。感谢您的建议。

标签: linker shared-libraries


【解决方案1】:

LD_PRELOAD(不是LD_PRELOAD_PATH)是在任何其他库之前加载的特定库(文件)列表,无论程序是否需要。 LD_LIBRARY_PATH 是一个目录 列表,在加载本来会加载的库时进行搜索。在 linux 上,您可以阅读 man ld.so 了解有关这些和其他影响动态链接器的环境变量的更多信息。

【讨论】:

  • 该死!那是我的错误。当我打算放置 LD_PRELOAD 时,我将 LD_PRELOAD_PATH 放在那个旧的 LG 列中!哇!
  • @JimDennis 哈哈!没想到在这里见到你。我不会反对你,但另一方面,如果他们正在编辑...... :)
  • 我已经好几年没做过 LG TAG 了。我来过这里,在 ServerFault、Quora、FaceBook、Google+、维基百科和其他各种维基媒体网站上。 “品牌”传播太薄,但这从来都不是我参加各种在线论坛的主要动机。 (在邮件列表中活跃于 USENet 网络新闻在那些事情发生的日子里)。具有讽刺意味的是,我遇到了这个问题,因为我想知道我使用 LD_PRELOAD_PATH 的尝试没有奏效——今天下午早些时候也将两者混为一谈。
  • 这很好用,直到您必须从非特权帐户在root 下启动某些东西。 DLL Hell 在 Linux 上也很活跃。
【解决方案2】:

LD_PRELOAD 更强大

最重要的区别在于 LD_PRELOAD 可以替换静态链接到二进制文件中的函数。

示例

如果您发现 LD_PRELOAD 对您有用,但 LD_LIBRARY_PATH 神秘地不起作用,那么几乎可以肯定,这就是原因。

例如,我在 bash 中调试 GNU Readline,起初我很困惑为什么我修改后的 libreadline.so 加载的是 LD_PRELOAD 而不是 LD_LIBRARY_PATH。

$ LD_PRELOAD=shlib/libreadline.so bash -
(worked)

$ LD_LIBRARY_PATH=shlib/ bash -
(failed)

查看ldd 命令,它列出了动态链接库的依赖关系,给出了答案:

$ ldd /bin/bash
        linux-vdso.so.1 
        libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 
        /lib64/ld-linux-x86-64.so.2

果然,libreadline 没有被列为共享库之一。因此,我机器上的 /bin/bash 必须在编译时与它自己的 libreadline 版本静态链接。 LD_LIBRARY_PATH 不起作用的原因是二进制文件从不要求动态链接器 (ld.so) 加载 libreadline。

另一方面,LD_PRELOAD 无论如何都会加载库,允许库覆盖甚至是静态链接的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 2010-12-26
    • 1970-01-01
    • 2015-03-12
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    相关资源
    最近更新 更多