假设我有一个二进制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 的路径中搜索它,只需使用二进制的符号,或中止。
我试图找到一些关于它的相关文档,但对于像我这样的链接器菜鸟来说并不容易:-)
最佳答案
您不能将库更改为不加载 static_lib.so
,但您可以欺骗它以使用 static_lib.a
。
默认情况下 ld
不会从可执行文件中导出任何符号,但您可以通过 -rdynamic
更改它。此选项非常粗糙,因为它导出所有静态符号,因此对于更细粒度的控制,您可以使用 -Wl,--dynamic-list
(请参阅 Clang sources 中的示例使用)。
关于linux - 加载共享库时,它是否可能引用当前二进制文件中的某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707958/