【问题标题】:Change in gnu ld linker behaviorgnu ld 链接器行为的变化
【发布时间】:2013-05-02 17:27:57
【问题描述】:

当我从使用 GNU ld 版本 2.20 转到 2.21 时,我开始看到以下行为变化。不确定是 2.21 中修复的 2.20 中的错误行为还是发生了其他问题。

libfoo.so : provides symbols foo() 
libfoobar.so : provides symbol bar() and specifies libfoo.so in its DT_NEEDED slot
main.cpp : uses symbols foo() as well as bar()

以前,我可以通过以下方式构建 main.cpp:

g++ main.cpp -lfoobar

foobar.so 对 foo.so 的内部依赖将确保找到 foo() 和 bar()

现在,上述方法不起作用,我还必须明确链接 foo :

g++ main.cpp -lfoobar -lfoo

所以我的问题是:什么是正确的行为 - 如果 .so 具有依赖项,那么在搜索可执行文件中直接使用的符号时是否会考虑它们,或者这些依赖项是否仅在 .so 的私有命名空间中可用?

谢谢。

【问题讨论】:

    标签: linux linker g++ ld


    【解决方案1】:

    所以我的问题是:什么是正确的行为

    新的行为是正确的。

    如果 .so 有依赖关系,那么在搜索可执行文件中直接使用的符号时会考虑它们

    没有。无论libfoobar.so 有什么依赖关系,都是私有 实现细节,明天可能会改变。你不应该指望它。如果您使用来自libfoo.so 的符号,那么您应该在命令行中指定-lfoo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2018-08-12
      • 2010-10-10
      • 1970-01-01
      • 2017-08-31
      • 2015-07-31
      • 2011-11-15
      相关资源
      最近更新 更多