Linux gnu ld链接器行为的更改

Linux gnu ld链接器行为的更改,linux,linker,g++,ld,Linux,Linker,G++,Ld,当我从使用GNULD版本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() 以前,我可以通过执行以下

当我从使用GNULD版本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
foo.so上foobar.so的内部依赖关系将确保找到foo()和bar()

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

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

谢谢

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

新的行为是正确的

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

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