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

被折叠的 条评论
为什么被折叠?



