【问题标题】:Symbol import in a dynamically loaded library (DSO)动态加载库 (DSO) 中的符号导入
【发布时间】:2014-05-20 23:14:01
【问题描述】:

假设我正在创建包含头文件的共享对象库 libz.so,比如说 stdio.h。作为 libc 库一部分的 stdio.h 代码在系统中静态链接。动态链接器如何解析从 DSO 到静态链接的 libc 文件的符号引用?

例如: 假设我将带有以下代码的 z.c 文件编译为 SO。

#include <stdio.h>

int foo(void){
  printf("hello world!\n");
}

动态链接器如何知道 printf 在静态链接的 libc 中的位置并在运行时修补 printf 地址?

【问题讨论】:

    标签: c dynamic dll


    【解决方案1】:

    一般来说,假设静态库使用与共享库兼容的 ABI(并非所有平台都如此),那么符号解析将委托给动态链接器。

    如果您的 DSO 已与 libc 静态链接,则它可能包含来自 libc 和其他库的所需代码的自己的副本。如果从另一个使用 libc 的可执行文件加载 DSO,则可能会产生问题。

    如果您的 DSO 与 libc 动态链接,则 DSO 将在其动态依赖项列表中添加所需的共享库,并且在加载之前将保留未解析的符号。

    假设我们正在处理后一种情况,因为这是通常发生的情况。

    当您加载 DSO 时,运行时链接器会递归地加载所需的共享库,并为每个未解析的符号尝试找出其位置。例如,如果您的可执行文件已静态链接 printf 并且您的 DSO 想要我们,动态链接器将解析来自 DSO 的引用以指向可执行文件中的 printf 位置。如果可执行文件与 libc 动态链接,printf 引用将指向 libc.so 中的代码。

    如果您在环境中设置 LD_DEBUG=all 并运行加载您的 DSO(或任何动态链接的可执行文件)的应用程序,您可以看到发生了什么。您将看到动态链接器正在做什么。输出很详细,但应该让您大致了解幕后发生的事情。

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2023-03-09
      • 2023-01-04
      相关资源
      最近更新 更多