2013-05-02 49 views
0

当我从使用GNU ld版本2.20到2.21时,我开始看到以下行为变化。不确定它是否在2.20中被破坏的行为在2.21中被修复或者其他事情正在发生。gnu ld链接器行为的变化

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(),以及巴()是发现

现在,上面不工作,我必须明确地将富和:

g++ main.cpp -lfoobar -lfoo 

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

谢谢。

回答

0

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

新的行为是正确的。

如果一个.so具有相关性,则是直接在可执行文件中使用的符号

无论libfoobar.so具有依赖性是私人实现细节号,可以改变明天搜索时,他们认为。你应该而不是指望它。如果您使用libfoo.so中的符号,则您应在命令行中指定指定-lfoo