glibc 知:手册36:动态链接器

本文深入探讨了GNU C库中的动态链接器,它负责加载动态链接程序及其依赖项。动态链接器也称为动态加载器,支持运行时加载共享对象。文章介绍了动态链接器自省的概念,包括如何使用_dl_find_object函数查询动态链接器信息,如对象的链接映射、异常处理数据等。此外,还详细阐述了相关结构体、宏定义和函数的功能,为理解和调试动态链接程序提供帮助。

1. 前言

The GNU C Library Reference Manual for version 2.35

2. 动态链接器

Dynamic Linker

动态链接器负责加载动态链接的程序及其依赖项(以共享对象的形式)。 GNU C 库中的动态链接器还支持稍后在运行时加载共享对象(例如插件)。

动态链接器有时也称为动态加载器。

2.1. 动态链接器自省

Dynamic Linker Introspection

GNU C 库提供了各种用于从动态链接器查询信息的函数。

数据类型:struct dl_find_object

此结构包含有关主程序或加载对象的信息。 _dl_find_object 函数使用它将结果数据返回给调用者。

unsigned long long int dlfo_flags

当前未使用,始终为 0。

void *dlfo_map_start

检查映射的起始地址。这个信息来自程序头,所以它遵循它的约定,并且地址不一定是页面对齐的。

void *dlfo_map_end

映射的结束地址。

struct link_map *dlf_link_map

该成员包含一个指向对象链接映射的指针。

void *dlfo_eh_frame

该成员包含一个指向对象异常处理数据的指针。请参阅下面的 DLFO_EH_SEGMENT_TYPE。

这个结构是一个 GNU 扩展。

宏:int DLFO_STRUCT_HAS_EH_DBASE

在大多数目标上,此宏定义为 0。如果将其定义为 1,则 struct dl_find_object 包含一个 void * 类型的附加成员 dlfo_eh_dbase。它是此位置的 DW_EH_PE_datarel DWARF 编码的基地址。

这个宏是一个 GNU 扩展。

宏:int DLFO_STRUCT_HAS_EH_COUNT

在大多数目标上,此宏定义为 0。如果将其定义为 1,则 struct dl_find_object 包含一个额外的 int 类型成员 dlfo_eh_count。它是由 dlfo_eh_frame 成员标识的 EH 帧段中异常处理条目的数量。

这个宏是一个 GNU 扩展。

宏:int DLFO_EH_SEGMENT_TYPE

在使用基于 DWARF 的异常展开的目标上,此宏扩展为 PT_GNU_EH_FRAME。这表明 struct dl_find_object 中的 dlfo_eh_frame 指向对象的 PT_GNU_EH_FRAME 段。在使用其他展开格式的目标上,宏扩展为展开数据的程序头类型。

这个宏是一个 GNU 扩展。

函数:int _dl_find_object (void *address, struct dl_find_object *result)

| MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

成功时,此函数返回 0 并将地址周围的对象写入 *result。失败时,返回-1。

地址可以是代码地址或数据地址。在使用函数描述符的体系结构上,不会尝试对函数描述符进行解码。根据这些描述符的实现方式,_dl_find_object 可能会返回定义函数描述符的对象(而不是包含实现函数的代码的对象),或者根本找不到任何对象。

如果成功地址大于或等于 result->dlfo_map_start 且小于 result->dlfo_map_end,即提供的代码地址位于报告的映射内。

该函数返回一个指向对象的展开信息的指针,该对象包含 result->dlfo_eh_frame 中的程序代码地址。如果平台使用 DWARF 展开信息,则这是 PT_GNU_EH_FRAME 段的内存地址。请参见上面的 DLFO_EH_SEGMENT_TYPE。如果地址位于缺少展开信息的对象中,该函数仍返回 0,但将 result->dlfo_eh_frame 设置为空指针。

_dl_find_object 本身是线程安全的。但是,如果应用程序对包含 address 的对象同时调用 _dl_find_object 或在调用返回后调用 dlclose,则访问该对象的展开数据或链接映射(通过 result->dlfo_link_map)是不安全的。因此,应用程序需要通过其他方式(例如,按照约定)确保在处理展开信息时地址仍然是有效的代码地址。

这个函数是一个 GNU 扩展。

3. 参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canpool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值