0

当我从使用 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

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

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

g++ main.cpp -lfoobar -lfoo

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

谢谢。

4

1 回答 1

0

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

新的行为是正确的。

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

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

于 2013-05-03T04:56:36.963 回答