【问题标题】:Why doesn't -L automatically include -rpath when shared library is used?为什么使用共享库时 -L 不自动包含 -rpath?
【发布时间】:2015-10-07 12:19:14
【问题描述】:

当 -L 已经告诉共享库路径在哪里时,我不明白为什么有必要使用 LD_LIBRARY_PATH 提供 rpath 或设置环境变量。

this answer 说:-L 告诉 ld 在 链接 时在哪里寻找要链接 的库。

但是为什么同时自动没有设置对应的-rpath呢?为什么我们需要再次手动操作?

P.S:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但如果是这样,那么 ld 在 linking 期间实际上做了什么,或者为什么在其他环境中 -rpath 不同时需要提供 -L 路径。

【问题讨论】:

  • 我同意这是链接器令人讨厌的错误功能。

标签: environment-variables ld rpath


【解决方案1】:

这绝对不是“链接器的错误功能”。

-L(一个更老的标志)只是告诉链接器在该目录中查找与任何后续 -l 标志匹配的 any 库,包括静态库/存档(请记住,有时过去,这是唯一类库)。它有意保留 link-time only 标志;链接器的业务完成后就没有效果了。

-rpath 是一个完全不同的野兽。其目的是在一个可执行文件或共享/动态库中嵌入一个或多个路径列表以搜索动态库,当在运行时在共享库中查找必要的符号时 em>(-rpath 中的r)。

在很多情况下,人们想要-L 而不是-rpath;特别是当一个人特别想要链接静态库而不是遵循动态链接器时。在大多数平台上,覆盖内置的 rpath 相对简单,即使用 LD_PRELOAD 环境变量,有些人实际上认为这是一个安全问题。

也许可以看看http://sta.li/faq,了解动态链接的令人信服的案例。

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 2018-11-10
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2012-01-18
    • 2014-05-25
    相关资源
    最近更新 更多