【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析
- 一、ELF概述
- 二、ELF的组成结构
- 2.1 ELF header:解析出 section headers 含31个section节和 program headers 含13个segment段
- 2.2 Section Headers:获取当前程序的31个section节区信息
- 2.2.1 [30] .shstrtab 节:保存各section节的字符串名 sh_name
- 2.2.2 [0] NULL 节:数据为空,大小
- 2.2.3 [1] .interp 节:保存编译时 ld 连接库的名字
- 2.2.4 [2] .note.gnu.property 节:
- 2.2.5 [3] .note.gnu.build-id 节:
- 2.2.6 [4] .note.ABI-tag 节:
- 2.2.7 [5] .gnu.hash 节:
- 2.2.8 [6] .dynsym 节:
- 2.2.9 [7] .dynstr 节:
- 2.2.10 [8] .gnu.version 节:
- 2.2.11 [9] .gnu.version_r 节:
- 2.2.12 [10] .rela.dyn 节:
- 2.2.13 [11] .rela.plt 节:
- 2.2.14 [12] .init 节:
- 2.2.15 [13] .plt 节:
- 2.2.16 [14] .plt.got 节:
- 2.2.17 [15] .plt.sec 节:
- 2.2.18 [16] .text 节:
- 2.2.19 [17] .fini 节:
- 2.2.20 [18] .rodata 节:
- 2.2.21 [19] .eh_frame_hdr 节:
- 2.2.22 [20] .eh_frame 节:
- 2.2.23 [21] .init_array 节:
- 2.2.24 [22] .fini_array 节:
- 2.2.25 [23] .dynamic 节:
- 2.2.26 [24] .got 节:
- 2.2.27 [25] .data 节:
- 2.2.28 [26] .bss 节:
- 2.2.29 [27] .comment 节:
- 2.2.30 [28] .symtab 节:
- 2.2.31 [29] .strtab 节:
- 2.2.32 [30] .shstrtab 节:
- 2.3 Program Headers:解析13个segment段 及 对应的虚拟地址和物理地址
- 2.4 Program Headers:解析13个segment 段和31个section节的映射关系
系列文章如下:
系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》
https://blog.csdn.net/Ciellee/article/details/130510069
.
1.《【Linux0.11代码分析】01 之 代码目录分析》
2.《【Linux0.11代码分析】02 之 bootsect.s 启动流程》
3.《【Linux0.11代码分析】03 之 setup.s 启动流程》
4.《【Linux0.11代码分析】04 之 head.s 启动流程》
5.《【Linux0.11代码分析】05 之 kernel 0号进程初始化 init\main.c 代码分析》
6.《【Linux0.11代码分析】06 之 kernel 1号进程 init() 代码分析》
7.《【Linux0.11代码分析】07 之 kernel execve() 函数 实现原理》
8.《【Linux0.11代码分析】08 之 ELF可执行程序01 - ELF header解析》
9.《【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析》
本文承接前文:《【Linux0.11代码分析】08 之 ELF可执行程序01 - ELF header解析》
本文,我们来详细分析下 Section Headers
中各section
的含义:
一、ELF概述
二、ELF的组成结构
2.1 ELF header:解析出 section headers 含31个section节和 program headers 含13个segment段
以上内容见:
《【Linux0.11代码分析】08 之 ELF可执行程序01 - ELF header解析》
2.2 Section Headers:获取当前程序的31个section节区信息
Section Headers
描述了所有的section
的信息,这是从编译和链接的角度来看ELF
文件的,通过它可以找到相应的 .section
节的内容,从而把它加载到相应的 segment
段区内存中。
当前 程序所包含的 section 节区信息如下 :
CielleeX:~/work/hello$ readelf -a hello
......
Section Headers:
[Nr] Name Type Address Offset Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 0
[ 1] .interp PROGBITS 0000000000000318 00000318 000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.gnu.pr[...] NOTE 0000000000000338 00000338 0000000000000030 0000000000000000 A 0 0 8
[ 3] .note.gnu.bu[...] NOTE 0000000000000368 00000368 0000000000000024 0000000000000000 A 0 0 4
[ 4] .note.ABI-tag NOTE 000000000000038c 0000038c 0000000000000020 0000000000000000 A 0 0 4
[ 5] .gnu.hash GNU_HASH 00000000000003b0 000003b0 0000000000000024 0000000000000000 A 6 0 8
[ 6] .dynsym DYNSYM 00000000000003d8 000003d8 00000000000000a8 0000000000000018 A 7 1 8
[ 7] .dynstr STRTAB 0000000000000480 00000480 000000000000008f 0000000000000000 A 0 0 1
[ 8] .gnu.version VERSYM 0000000000000510 00000510 000000000000000e 0000000000000002 A 6 0 2
[ 9] .gnu.version_r VERNEED 0000000000000520 00000520 0000000000000030 0000000000000000 A 7 1 8
[10] .rela.dyn RELA 0000000000000550 00000550 00000000000000c0 0000000000000018 A 6 0 8
[11] .rela.plt RELA 0000000000000610 00000610 0000000000000018 0000000000000018 AI 6 24 8
[12] .init PROGBITS 0000000000001000 00001000 000000000000001b 0000000000000000 AX 0 0 4
[13] .plt PROGBITS 0000000000001020 00001020 0000000000000020 0000000000000010 AX 0 0 16
[14] .plt.got PROGBITS 0000000000001040 00001040 0000000000000010 0000000000000010 AX 0 0 16
[15] .plt.sec PROGBITS 0000000000001050 00001050 0000000000000010 0000000000000010 AX 0 0 16
[16] .text PROGBITS 0000000000001060 00001060 0000000000000176 0000000000000000 AX 0 0 16
[17] .fini PROGBITS 00000000000011d8 000011d8 000000000000000d 0000000000000000 AX 0 0 4
[18] .rodata PROGBITS 0000000000002000 00002000 0000000000000022 0000000000000000 A 0 0 4
[19] .eh_frame_hdr PROGBITS 0000000000002024 00002024 000000000000003c 0000000000000000 A 0 0 4
[20] .eh_frame PROGBITS 0000000000002060 00002060 00000000000000cc 0000000000000000 A 0 0 8
[21] .init_array INIT_ARRAY 0000000000003db8 00002db8 0000000000000008 0000000000000008 WA 0 0 8
[22] .fini_array FINI_ARRAY 0000000000003dc0 00002dc0 0000000000000008 0000000000000008 WA 0 0 8
[23] .dynamic DYNAMIC 0000000000003dc8 00002dc8 00000000000001f0 0000000000000010 WA 7 0 8
[24] .got PROGBITS 0000000000003fb8 00002fb8 0000000000000048 0000000000000008 WA 0 0 8
[25] .data PROGBITS 0000000000004000 00003000 0000000000000010 0000000000000000 WA 0 0 8
[26] .bss NOBITS 0000000000004010 00003010 0000000000000008 0000000000000000 WA 0 0 1
[27] .comment PROGBITS 0000000000000000 00003010 000000000000002d 0000000000000001 MS 0 0 1
[28] .symtab SYMTAB 0000000000000000 00003040 0000000000000378 0000000000000018 29 18 8
[29] .strtab STRTAB 0000000000000000 000033b8 00000000000001e1 0000000000000000 0 0 1
[30] .shstrtab STRTAB 0000000000000000 00003599 000000000000011a 0000000000000000 0 0 1
从前面 elf header 解析中,我们能够知道:
section headers
的偏移地址是 14008 bytes
,大小为64 bytes
,总共包含 31
个 section
,也就是共占 31x64=1984bytes
获取所有 section
的命令为: hexdump -C -s 14008 -n 1984 hello
我们先读三个 section
内容出来看下,如下:
如上,第一个section
均为0
,使用 *
省略了,我们把它展开来,如下:
lihaiyan@CielleeX:~/work/hello$ hexdump -C -s 14008 -n 192 hello
第一个section 节区
000036b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036d8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036e8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
第二个section 节区:当前section 的name,保存在.shstrtab 的节区中偏移 0x1b 的位置处
000036f8 【1b 00 00 00】 01 00 00 00 02 00 00 00 00 00 00 00 |................|
00003708 18 03 00 00 00 00 00 00 18 03 00 00 00 00 00 00 |................|
00003718 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003728 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
第三个section 节区:当前section 的name,保存在.shstrtab 的节区中偏移 0x23 的位置处
00003738 23 00 00 00 07 00 00 00 02 00 00 00 00 00 00 00 |#...............|
00003748 38 03 00 00 00 00 00 00 38 03 00 00 00 00 00 00 |8.......8.......|
00003758 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |0...............|
00003768 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003778
各section
节结构体信息定义如下:
typedef struct {
Elf64_Word sh_name; // 4 B (B for bytes)
===>ELF文件中的每个节都有一个唯一的名称,如果sh_name 属性值为 0x00000035,表示该节的名称在节名称字符串表中的第 0x35 个字节处开始。
Elf64_Word sh_type; // 4 B
===============>
+ sh_type 是一个表示 ELF 文件中每个节的类型的属性值,通常使用 Elf64_Word 类型来存储。其取值范围是由标准定义的一些枚举值,例如:
+ SHT_NULL: 0,表示该节头部表项无效。
+ SHT_PROGBITS: 1,表示该节包含程序定义的信息,如代码、数据等。
+ SHT_SYMTAB: 2,表示该节包含符号表,存储在文件中的全局和局部符号信息。
+ SHT_STRTAB: 3,表示该节包含字符串表,存储以 NULL 结尾的 ASCII 字符串。
+ SHT_RELA: 4,表示该节包含重定位条目,为保证程序的可执行性而进行修正。
+ SHT_HASH: 5,表示该节包含哈希表,用于加速符号查找。
+ SHT_DYNAMIC: 6,表示该节包含动态连接信息。
+ SHT_NOTE: 7,表示该节包含一些附加信息,如版本信息。
+ SHT_REL: 9,表示该节包含重定位条目,不含添加常量值的重定位信息。
+ SHT_DYNSYM: 11,表示该节包含动态符号表,只包含全局符号信息。
<===============
Elf64_Xword sh_flags; // 8 B
===============>
+ sh_flags 是一个表示 ELF 文件中每个节的属性标志值的属性,通常使用 Elf64_Xword 类型来存储。
+ sh_flags 属性的各个标志位对应的含义如下:
+ SHF_WRITE (0x1):该节包含可写数据。
+ SHF_ALLOC (0x2):该节会被加载到内存中。
+ SHF_EXECINSTR (0x4):该节包含可执行的指令。
+ SHF_MERGE (0x10):该节中的相邻数据可以合并为较大的数据块。
+ SHF_STRINGS (0x20):该节包含以 NULL 结尾的 ASCII 字符串。
+ SHF_INFO_LINK (0x40):该节的 sh_info 字段包含相关信息
<===============
Elf64_Addr sh_addr; // 8 B
Elf64_Off sh_offset; // 8 B
Elf64_Xword sh_size; // 8 B
Elf64_Word sh_link; // 4 B
Elf64_Word sh_info; // 4 B
Elf64_Xword sh_addralign; // 8 B
Elf64_Xword sh_entsize; // 8 B
} Elf64_Shdr; // total size: 64 B
下面,我们对每个节进行分析:
2.2.1 [30] .shstrtab 节:保存各section节的字符串名 sh_name
之所以优先分析 .shstrtab
节,是因为它保存了所有 section
节区的字符串名 sh_name
,
先把它的信息读取出来吧:
.shstrtab
节的偏移位置为:
14008
b
y
t
e
s
+
30
∗
64
=
15928
14008 bytes + 30 * 64 = 15928
14008bytes+30∗64=15928
我们来对它解析下:
CielleeX:~/work/hello$ hexdump -C -s 15928 -n 64 hello
00003e38 11 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 |................|
00003e48 00 00 00 00 00 00 00 00 99 35 00 00 00 00 00 00 |.........5......|
00003e58 1a 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003e68 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003e78
typedef struct {
Elf64_Word sh_name; // 4 B // 节名称位于偏移 0x11 处
---> 00003e38 【11 00 00 00】 03 00 00 00 00 00 00 00 00 00 00 00
Elf64_Word sh_type; // 4 B // 03对应SHT_STRTAB类型,表示该节包含字符串表,存储以 NULL 结尾的 ASCII 字符串
---> 00003e38 11 00 00 00 【03 00 00 00】 00 00 00 00 00 00 00 00
Elf64_Xword sh_flags; // 8 B // 无flag属性
---> 00003e38 11 00 00 00 03 00 00 00 【00 00 00 00 00 00 00 00】
Elf64_Addr sh_addr; // 8 B // 无虚拟入口
---> 00003e48 【00 00 00 00 00 00 00 00】 99 35 00 00 00 00 00 00
Elf64_Off sh_offset; // 8 B // 该 section 在当前文件中的偏移为 0x00003599
---> 00003e48 00 00 00 00 00 00 00 00 【99 35 00 00 00 00 00 00】
Elf64_Xword sh_size; // 8 B // 大小为 0x011a = 282 bytes
---> 00003e58 【1a 01 00 00 00 00 00 00】 00 00 00 00 00 00 00 00
Elf64_Word sh_link; // 4 B // 无相关的 section
---> 00003e58 1a 01 00 00 00 00 00 00 【00 00 00 00】 00 00 00 00
Elf64_Word sh_info; // 4 B // 无额外的section 信息
---> 00003e58 1a 01 00 00 00 00 00 00 00 00 00 00 【00 00 00 00】
Elf64_Xword sh_addralign; // 8 B // 该 section的对齐宽度为 01
---> 00003e68 【01 00 00 00 00 00 00 00】 00 00 00 00 00 00 00 00
Elf64_Xword sh_entsize; // 8 B // 该section 不包含 table,所该字段为0
---> 00003e68 01 00 00 00 00 00 00 00 【00 00 00 00 00 00 00 00】
} Elf64_Shdr; // total size: 64 B
通过解析,我们得知:
.shstrtab
节 的内容位于文件偏移 0x00003599 (13721)
处,大小为 282 bytes
,我们读出来看看,
如下 ,果然是各个section
节区的sh_name
:
比如,当前 section
的 sh_name
为 0x11 (17)
,
对应的二进制为: 2e 73 68 73 74 72 74 61 62 00
,对应的字符串为:.shstrtab
CielleeX:~/work/hello$ hexdump -C -s 13721 -n 282 hello
00003599 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 |..symtab..strtab|
000035a9 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte|
000035b9 72 70 00 2e 6e 6f 74 65 2e 67 6e 75 2e 70 72 6f |rp..note.gnu.pro|
000035c9 70 65 72 74 79 00 2e 6e 6f 74 65 2e 67 6e 75 2e |perty..note.gnu.|
000035d9 62 75 69 6c 64 2d 69 64 00 2e 6e 6f 74 65 2e 41 |build-id..note.A|
000035e9 42 49 2d 74 61 67 00 2e 67 6e 75 2e 68 61 73 68 |BI-tag..gnu.hash|
000035f9 00 2e 64 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 |..dynsym..dynstr|
00003609 00 2e 67 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 |..gnu.version..g|
00003619 6e 75 2e 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 |nu.version_r..re|
00003629 6c 61 2e 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 |la.dyn..rela.plt|
00003639 00 2e 69 6e 69 74 00 2e 70 6c 74 2e 67 6f 74 00 |..init..plt.got.|
00003649 2e 70 6c 74 2e 73 65 63 00 2e 74 65 78 74 00 2e |.plt.sec..text..|
00003659 66 69 6e 69 00 2e 72 6f 64 61 74 61 00 2e 65 68 |fini..rodata..eh|
00003669 5f 66 72 61 6d 65 5f 68 64 72 00 2e 65 68 5f 66 |_frame_hdr..eh_f|
00003679 72 61 6d 65 00 2e 69 6e 69 74 5f 61 72 72 61 79 |rame..init_array|
00003689 00 2e 66 69 6e 69 5f 61 72 72 61 79 00 2e 64 79 |..fini_array..dy|
00003699 6e 61 6d 69 63 00 2e 64 61 74 61 00 2e 62 73 73 |namic..data..bss|
000036a9 00 2e 63 6f 6d 6d 65 6e 74 00 |..comment.|
000036b3
2.2.2 [0] NULL 节:数据为空,大小
第一个section 节,数据全为空,如下:
lihaiyan@CielleeX:~/work/hello$ hexdump -C -s 14008 -n 64 hello
000036b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036d8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036e8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000036f8
2.2.3 [1] .interp 节:保存编译时 ld 连接库的名字
我们把.interp
节的内容打印出来,它的位置位于 14008 + 64 = 14072
byte
CielleeX:~/work/hello$ hexdump -C -s 14072 -n 64 hello
000036f8 1b 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 |................|
00003708 18 03 00 00 00 00 00 00 18 03 00 00 00 00 00 00 |................|
00003718 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003728 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00003738
每个 section header
中包含 10
个条目,每个条目占用 4
字节进行描述,
因为当前 elf
文件是小端,所以所有的字节都以小端模式进行解析,section header
解析:
字段类型 | value | 注释 |
---|---|---|
sh_name 4Byte | 1b 00 00 00 | 该section name 被保存在 .shstrtab 中,偏移地址为 0x1b |
sh_type 4Byte | 01 00 00 00 | 01 对应PROGBITS 类型,表示当前类型为程序数据 |
sh_flags 8Byte | 02 00 00 00 00 00 00 00 | 02 对应 SHF_ALLOC ,表示程序加载时需要向内核 申请内存 |
sh_addr 8Byte | 18 03 00 00 00 00 00 00 | 程序的虚拟地址入口为 0x00000318 |
sh_offset 8Byte | 18 03 00 00 00 00 00 00 | 该 section 在当前文件中的偏移为 0x00000318 |
sh_size 8Byte | 1c 00 00 00 00 00 00 00 | 该 section 的 size 为 0x0000001c |
sh_link 4Byte | 00 00 00 00 | 无相关的 section |
sh_info 4Byte | 00 00 00 00 | 无额外的section 信息 |
sh_addralign 8Byte | 01 00 00 00 00 00 00 00 | 该 section的对齐宽度为 01 |
sh_entsize 8Byte | 00 00 00 00 00 00 00 00 | 该section 不包含 table,所该字段为0 |
可以看到,
-
当前
section
节区名保存存偏移0x1b
处,对应十六进制为【2e 69 6e 74 65 72 70 00】
, 名为.interp
000035a9 00 2e 73 68 73 74 72 74 61 62 00 【2e 69 6e 74 65 |..shstrtab..inte|
000035b9 72 70 00】 2e 6e 6f 74 65 2e 67 6e 75 2e 70 72 6f |rp..note.gnu.pro|
-
.interp
的数据,保存在文件第0x318
的位置处,总长度为0x1c
,我们把这一块的数据打印出来看一下:
可以看出,它保存的内容为:/lib64/ld-linux-x86-64.so.2
, 是编译时的 ld
链接库的名字
2.2.4 [2] .note.gnu.property 节:
我们把.interp
节的内容打印出来,它的位置位于 14008 + 2x64 = 14136
byte
2.2.5 [3] .note.gnu.build-id 节:
2.2.6 [4] .note.ABI-tag 节:
2.2.7 [5] .gnu.hash 节:
2.2.8 [6] .dynsym 节:
2.2.9 [7] .dynstr 节:
2.2.10 [8] .gnu.version 节:
2.2.11 [9] .gnu.version_r 节:
2.2.12 [10] .rela.dyn 节:
2.2.13 [11] .rela.plt 节:
2.2.14 [12] .init 节:
2.2.15 [13] .plt 节:
2.2.16 [14] .plt.got 节:
2.2.17 [15] .plt.sec 节:
2.2.18 [16] .text 节:
2.2.19 [17] .fini 节:
2.2.20 [18] .rodata 节:
2.2.21 [19] .eh_frame_hdr 节:
2.2.22 [20] .eh_frame 节:
2.2.23 [21] .init_array 节:
2.2.24 [22] .fini_array 节:
2.2.25 [23] .dynamic 节:
2.2.26 [24] .got 节:
2.2.27 [25] .data 节:
2.2.28 [26] .bss 节:
2.2.29 [27] .comment 节:
2.2.30 [28] .symtab 节:
2.2.31 [29] .strtab 节:
2.2.32 [30] .shstrtab 节:
2.3 Program Headers:解析13个segment段 及 对应的虚拟地址和物理地址
描述了各个 segment 段的虚拟地址 和 物理地址,及其对应的权限 RW
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x00000000000002d8 0x00000000000002d8 R 0x8
INTERP 0x0000000000000318 0x0000000000000318 0x0000000000000318
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000628 0x0000000000000628 R 0x1000
LOAD 0x0000000000001000 0x0000000000001000 0x0000000000001000
0x00000000000001e5 0x00000000000001e5 R E 0x1000
LOAD 0x0000000000002000 0x0000000000002000 0x0000000000002000
0x000000000000012c 0x000000000000012c R 0x1000
LOAD 0x0000000000002db8 0x0000000000003db8 0x0000000000003db8
0x0000000000000258 0x0000000000000260 RW 0x1000
DYNAMIC 0x0000000000002dc8 0x0000000000003dc8 0x0000000000003dc8
0x00000000000001f0 0x00000000000001f0 RW 0x8
NOTE 0x0000000000000338 0x0000000000000338 0x0000000000000338
0x0000000000000030 0x0000000000000030 R 0x8
NOTE 0x0000000000000368 0x0000000000000368 0x0000000000000368
0x0000000000000044 0x0000000000000044 R 0x4
GNU_PROPERTY 0x0000000000000338 0x0000000000000338 0x0000000000000338
0x0000000000000030 0x0000000000000030 R 0x8
GNU_EH_FRAME 0x0000000000002024 0x0000000000002024 0x0000000000002024
0x000000000000003c 0x000000000000003c R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
GNU_RELRO 0x0000000000002db8 0x0000000000003db8 0x0000000000003db8
0x0000000000000248 0x0000000000000248 R 0x1
2.4 Program Headers:解析13个segment 段和31个section节的映射关系
可以看出,.init_array .fini_array .dynamic .got .data .bss
这个section
节是保存在第6个 segment
段中
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.gnu.property .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt
03 .init .plt .plt.got .plt.sec .text .fini
04 .rodata .eh_frame_hdr .eh_frame
05 .init_array .fini_array .dynamic .got .data .bss
06 .dynamic
07 .note.gnu.property
08 .note.gnu.build-id .note.ABI-tag
09 .note.gnu.property
10 .eh_frame_hdr
11
12 .init_array .fini_array .dynamic .got