【问题标题】:When a shared library is loaded, is it possible that it references something in the current binary?加载共享库时,它是否可能引用当前二进制文件中的某些内容?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2012-02-05
    • 2013-05-05
    相关资源
    最近更新 更多