加载共享库时,它是否可能引用当前二进制文件中的某些内容?

时间:2016-08-01 20:55:39

标签: linux gcc linker shared-libraries ld

说我有一个二进制server,当它被编译时,它从server.cstatic_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,因为它是第三方库。

我的问题是,是否有可能让dynamic_lib.sold本身首先搜索当前二进制文件,或者甚至不在ld的路径中搜索它,只使用二进制符号或中止。< / p>

我试图找到一些关于它的相关文档,但是关于像我这样的连接器的新手并不容易: - )

1 个答案:

答案 0 :(得分:0)

您不能将库更改为不加载static_lib.so,但可以欺骗它使用 static_lib.a

默认情况下,ld不会从可执行文件中导出任何符号,但是您可以通过-rdynamic进行更改。该选项非常粗略,因为它会导出所有静态符号,因此对于更细粒度的控制,您可以使用-Wl,--dynamic-list(请参见Clang sources中的示例使用)。