elf文件解析(二)——dynamic段/节和各个节的关系
dynamic节——以libc64为例
一个例子
先查看段表,以及段表项和节表项的映射关系,可以发现DYNAMIC段和.dynamic节是一对一映射的,而根据DYNAMIC段可以知道.dynamic的基地址和偏移

然后再来看.dynamic表的表项,首先看最后一项是NULL,这个是DT_NULL
类型的,用来标志.section的结尾

.dynamic节的定义
1 |
|
其中d_tag
字段决定了此项的类型,已经d_un
的含义
上图各个项的类型和含义如下表所示:
序号 | 类型 | 描述 |
---|---|---|
1 | DT_NEEDED | 依赖项名称的索引,表示依赖ld-android.so |
2 | DT_NEEDED | 依赖项名称的索引,表示依赖libdl.so |
3 | SONAME | 动态库的名字 |
4 | BIND_NOW | 执行非惰性处理 |
5 | NOW | 执行完整的重定位处理 |
6 | RELA | 重定位表(.rela.dyn)的地址 |
7 | RELASZ | 重定位表的总大小 |
8 | RELANET | 相对重定位表项的大小 |
9 | RELACOUNT | 相对重定位表项的数目 |
10 | JMPREL | 与PLT相关的重定位表项(.rela.plt)的入口地址 |
11 | PLTRELSZ | 与PLT相关的重定位表项的大小 |
12 | PLTGOT | got.plt(全局偏移量表)的起始地址 |
13 | PLTREL | 过程链接表引用的重定位条目的类型,DT_REL 或DT_RELA |
14 | SYMTAB | 符号表(.dynsym)的地址 |
15 | SYMNET | DT_SYMTAB 符号条目的大小(以字节为单位) |
16 | STRTAB | 字符串表(.dynstr)的地址。包含符号名称、依赖项名称和其他字符串 |
17 | STRSZ | DT_STRTAB 字符串表的总大小(以字节为单位) |
18 | GNU_HASH | 符号哈希表(.gnu.hash)的地址 |
19 | INIT_ARRAY | 初始化函数指针数组(.init_array)的地址 |
20 | INIT_ARRAYSZ | DT_INIT_ARRAY 数组的总大小(以字节为单位) |
21 | FINI_ARRAY | 终止函数指针数组(.fini_array)的地址 |
22 | FINI_ARRAYSZ | DT_FINI_ARRAY 数组的总大小(以字节为单位) |
23 | VERSYM | .gnu.version节的起始地址 |
24 | VERDEF | 版本定义表(.gnu.version_d)的起始地址 |
25 | VERDEFNUM | DT_VERDEF 表中的条目数 |
26 | VERNEED | 版本依赖表(.gnu.version_r)的地址 |
27 | VERNEEDNUM | DT_VERNEEDNUM 表中的条目数 |
28 | NULL | 标志.section的结尾 |
根据上表得到的信息可以得到的节信息有如下图所示:


最后两个都是字符串表,但是IDA PRO没有解析出来,难绷。但是010 editor可以


而且SYMTAB
IDA
PRO也不能解析出来(甚至是没有这块儿地址空间),但是010editor可以


参考链接:https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html#chapter7-tbl-5
elf文件解析(二)——dynamic段/节和各个节的关系
http://showfaker.top/2024/03/14/dynamic段-节和各个节的关系/