【DeepSeek】ELF中的dynamic段

张开发
2026/4/17 19:43:57 15 分钟阅读

分享文章

【DeepSeek】ELF中的dynamic段
dynamic 段详解定义、内容与生命周期.dynamic段是 ELF 文件中用于动态链接的核心信息段。它就像程序的“施工图纸”告诉动态链接器如何加载和初始化程序。以下从生命周期、结构内容、运行时作用三个维度进行详细解析1. 生命周期编译/链接时决定运行时读取这是最核心的概念.dynamic段是静态产物而非动态生成物。生成时间编译/链接阶段。当你执行gcc进行链接时静态链接器ld会分析代码中引用了哪些外部库如libc.so。链接器将这些依赖信息、查找规则、表的位置等写入.dynamic段并固化在硬盘上的 ELF 文件中。运行时角色被动读取。程序启动时动态链接器ld-linux.so充当“读者”。它读取文件中已有的.dynamic段根据里面的指示去加载库、解析符号、修正 GOT 表。运行过程中.dynamic段的内容通常不会被修改。2. 结构与内容里面有什么.dynamic段本质上是一个结构体数组。数组中的每一项都由一个Tag标签和对应的Value值组成。结构定义Elf64_Dyntypedefstruct{Elf64_Sxword d_tag;// 标签决定这一项是什么类型union{Elf64_Xword d_val;// 整数值Elf64_Addr d_ptr;// 地址值}d_un;}Elf64_Dyn;主要包含以下几类关键信息Tag 类型含义作用说明DT_NEEDED依赖库列出程序运行必须加载的共享库如libc.so.6。链接器会递归加载这些库。DT_STRTAB字符串表地址指向.dynstr段里面存着函数名字符串如printf。DT_SYMTAB符号表地址指向.dynsym段里面存着符号结构体名称偏移、哈希值等。DT_GNU_HASH哈希表地址用于加速符号查找避免遍历整个表。DT_JMPREL重定位表地址指向.rela.plt段记录了哪些 GOT 条目需要被修正以及对应的符号信息。DT_PLTGOTGOT 表地址指向全局偏移表GOT的起始地址。这建立了.dynamic与 GOT 的联系。DT_INIT初始化函数指向_init函数的地址程序启动时执行。DT_RPATH库搜索路径指定加载依赖库时的搜索路径。DT_NULL结束标记数组以 Tag 为 0 的条目结尾。3. 实例分析readelf -d 输出通过命令readelf -d executable可以直观看到这些内容Dynamic section at offset 0xe28 contains 24 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] -- 依赖库 0x000000000000000c (INIT) 0x1000 -- 初始化地址 0x0000000000000004 (STRTAB) 0x300 -- 字符串表地址 0x0000000000000006 (SYMTAB) 0x2b0 -- 符号表地址 0x0000000000000003 (PLTGOT) 0x4000 -- GOT表地址 0x0000000000000017 (JMPREL) 0x380 -- 重定位表地址 0x0000000000000000 (NULL) 0x0 -- 结束4. 运行时机制与 GOT 的闭环.dynamic段虽然是静态的但它指导了动态过程。它与 GOT 表形成了紧密的配合关系定位动态链接器读取.dynamic中的DT_PLTGOT找到 GOT 表在内存中的位置。依据链接器读取.dynamic中的DT_JMPREL重定位表知道 GOT 表中的哪一项对应哪个函数。解析链接器查找DT_NEEDED中的库找到函数的真实地址。写入链接器将真实地址写回 GOT 表。

更多文章