gnu ld链接器行为的变化

时间:2013-05-02 17:27:58

标签: linux linker g++ ld

当我从使用GNU ld版本2.20到2.21时,我开始看到以下行为的变化。不确定2.20中的行为是否已经在2.21中修复,或者是否正在进行其他操作。

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的私有命名空间中可用?< / p>

感谢。

1 个答案:

答案 0 :(得分:0)

  

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

新行为是正确的。

  

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

没有。任何依赖关系libfoobar.so都有私有实现细节,明天可能会改变。你应该指望它。如果您使用libfoo.so中的符号,则 应在命令行上指定-lfoo