当我从使用 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 的私有命名空间中可用?
谢谢。