gpt4 book ai didi

c - 动态加载库 (DSO) 中的符号导入

转载 作者:行者123 更新时间:2023-11-30 17:33:22 31 4
gpt4 key购买 nike

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

例如:假设我使用以下代码将 z.c 文件编译成 SO。

#include <stdio.h>

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

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

最佳答案

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

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

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

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

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

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

关于c - 动态加载库 (DSO) 中的符号导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771487/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com