【发布时间】:2016-08-01 20:55:39
【问题描述】:
假设我有一个二进制文件server,当它被编译时,它从server.c、static_lib.a 链接,并与dynamic_lib.so 动态链接。
当服务器执行并动态加载dynamic_lib.so,但在代码路径上,dynamic_lib.so 实际上需要来自static_lib.a 的一些符号。我看到的是,dynamic_lib.so 引入了static_lib.so,所以基本上我的内存中有两个 static_lib。
假设我们无法更改 dynamic_lib.so,因为它是第 3 方库。
我的问题是,是否可以让dynamic_lib.so 或ld 本身先搜索当前二进制文件,甚至不在ld 的路径中搜索,只使用二进制文件的符号,或者中止。
我试图找到一些有关它的相关文档,但对于像我这样的链接器的新手来说并不容易:-)
【问题讨论】:
-
这就是它的作用。但如果它实际上没有在二进制文件中导出,那么...
-
真的吗?我如何检查或确定这个程序?在 ld.so 的手册页中没有找到任何相关内容
-
这是因为加载器负责加载库,而不是执行符号查找。请参阅
dlsym(3)和dlsym(3p)手册页。 -
我明白了,谢谢!我可以通过 strace 二进制文件来查看这个过程,对吗?确认一下,即使 dynamic_lib.so 在其标头中声明其依赖于 static_lib.so 也是如此? (ldd 输出)
-
我不确定,我从未尝试过。无论加载什么库,符号查找都是相同的。
标签: linux gcc linker shared-libraries ld