【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析

news2024/10/5 3:10:58

【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,总共包含 31section,也就是共占 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 的位置处
000036f81b 00 00 0001 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+3064=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 处
		---> 00003e3811 00 00 0003 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 0003 00 00 0000 00 00 00 00 00 00 00
	
	Elf64_Xword sh_flags; 		// 8 B			// 无flag属性
		---> 00003e38  11 00 00 00 03 00 00 0000 00 00 00 00 00 00 00】
	
	Elf64_Addr sh_addr; 		// 8 B			// 无虚拟入口
		---> 00003e4800 00 00 00 00 00 00 0099 35 00 00 00 00 00 00
		
	Elf64_Off sh_offset; 		// 8 B			// 该 section 在当前文件中的偏移为 0x00003599
		---> 00003e48  00 00 00 00 00 00 00 0099 35 00 00 00 00 00 00】

	Elf64_Xword sh_size; 		// 8 B			// 大小为 0x011a = 282 bytes
		---> 00003e581a 01 00 00 00 00 00 0000 00 00 00 00 00 00 00
		
	Elf64_Word sh_link; 		// 4 B			// 无相关的 section
		---> 00003e58  1a 01 00 00 00 00 00 0000 00 00 0000 00 00 00
	Elf64_Word sh_info; 		// 4 B			// 无额外的section 信息
		---> 00003e58  1a 01 00 00 00 00 00 00  00 00 00 0000 00 00 00】
		
	Elf64_Xword sh_addralign; 	// 8 B			// 该 section的对齐宽度为 01
		---> 00003e6801 00 00 00 00 00 00 0000 00 00 00 00 00 00 00
		
	Elf64_Xword sh_entsize; 	// 8 B			// 该section 不包含 table,所该字段为0
		---> 00003e68  01 00 00 00 00 00 00 0000 00 00 00 00 00 00 00} Elf64_Shdr; 					// total size: 64 B

通过解析,我们得知:
.shstrtab 节 的内容位于文件偏移 0x00003599 (13721) 处,大小为 282 bytes,我们读出来看看,
如下 ,果然是各个section 节区的sh_name
在这里插入图片描述
比如,当前 sectionsh_name0x11 (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 4Byte1b 00 00 00section name被保存在 .shstrtab中,偏移地址为 0x1b
sh_type 4Byte01 00 00 00 01 对应PROGBITS 类型,表示当前类型为程序数据
sh_flags 8Byte02 00 00 00 00 00 00 0002 对应 SHF_ALLOC,表示程序加载时需要向内核 申请内存
sh_addr 8Byte18 03 00 00 00 00 00 00程序的虚拟地址入口为 0x00000318
sh_offset 8Byte18 03 00 00 00 00 00 00section 在当前文件中的偏移为 0x00000318
sh_size 8Byte1c 00 00 00 00 00 00 00sectionsize0x0000001c
sh_link 4Byte00 00 00 00无相关的 section
sh_info 4Byte00 00 00 00无额外的section 信息
sh_addralign 8Byte01 00 00 00 00 00 00 00该 section的对齐宽度为 01
sh_entsize 8Byte00 00 00 00 00 00 00 00该section 不包含 table,所该字段为0

可以看到,

  1. 当前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|

  2. .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




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18-03 MySQL高可用方案与选择

主从复制 读写分离 流程 原理 bin log STATEMENT 优点&#xff1a;记录的是执行的SQL,比较省空间&#xff0c;降低了主从复制时的IO开销缺点&#xff1a;由于记录的是SQL&#xff0c;所以MySQL多个节点之间复制的时候&#xff0c;特定场景下会导致数据不一致的情况 ROW 优点…

【多线程进阶二】JUC工具类 线程安全的集合类 死锁

目录 一、JUC工具类 &#x1f345;1、Callable接口 &#x1f345;2、ReentrantLock &#x1f345;3、原子类 &#x1f345;4、Semaphore信号量 &#x1f345;5、CountDownLatch 二、线程安全的集合类 ​&#x1f345;1、多线程环境下&#xff0c;怎么使用线程安全…

第十三届蓝桥杯国赛JavaB组题解

A. 重合次数 思路&#xff1a; 枚举不同的时刻&#xff0c;判断哪些时刻秒针和分针表示的数字是相同的。这道题坑就坑在:xx:59:59 xx:00:00分针和时。也就是说一个小时会重叠两次。 题目要求是分钟和秒钟的重叠次数,故时钟,分钟,秒钟同时重叠的次数不算(这题还是有点咬文嚼字了…

MySQL---事务

1. 事务操作 开启事务&#xff1a;Start Transaction 任何一条DML语句(insert、update、delete)执行&#xff0c; 标志事务的开启命令&#xff1a;BEGIN 或 START TRANSACTION 提交事务&#xff1a;Commit Transaction 成功的结束&#xff0c;将所有的DML语句操作历史记录…

G2O学习使用

g2o全称是General Graph Optimization&#xff0c;也就是图优化&#xff0c;我们在做SLAM后端或者更加常见的任何优化问题&#xff08;曲线拟合&#xff09;都可以使用G2O进行处理。 就经验而言&#xff0c;solvers给人的感觉是大同小异&#xff0c;而 types 的选取&#xff0…

C语言小游戏——扫雷

前言 结合前边我们所学的C语言知识&#xff0c;本期我们将使用C语言实现一个简单的小游戏——扫雷 目录 前言 总体框架设计 多文件分装程序 各功能模块化实现 初始化棋盘 棋盘打印 埋雷 判赢与排雷 游戏逻辑安排 总结 总体框架设计 和三子棋相同&#xff0c;游戏开始时…

32岁测试工程师,陷入中年危机,最终我裸辞了....

前言 今年32岁&#xff0c;我从公司离职了&#xff0c;是裸辞。 前段时间&#xff0c;我有一件事情一直憋在心里很难受&#xff0c;想了很久也没找到合适的人倾诉&#xff0c;就借着今天写出来。 我一个十几年IT经验&#xff0c;七年测试经验的职场老人&#xff0c;我慢慢涨…

02 Android开机启动之BootLoader及kernel的启动

Android开机启动之BootLoader及kernel的启动 1、booloader的启动流程 第一阶段:硬件初始化,SVC模式,关闭中断,关闭看门狗,初始化栈,进入C代码 第二阶段:cpu/board/中断初始化;初始化内存以及flash,将kernel从flash中拷贝到内存中,执行bootm,启动内核 2、kernel的启…

学习如何将Jenkins与UI测试报告完美整合,事半功倍,轻松获取高薪职位!

目录 引言 &#xff08;一&#xff09;在本地整合出报告 1.在cmd分别安装pytest和allure-pytest 2.进入需要执行的代码所在的路径 3.运行测试报告&#xff0c;代码如下 4.解析此json文件&#xff0c;代码如下&#xff08;新打开cmd进入路径&#xff09; 5.打开此HTML文件…

包管理工具

包 package&#xff0c;代表了一组特定功能的源码集合。 包管理工具 管理包的应用软件&#xff0c;可以对包进行下载安装、更新、删除、上传等操作。 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提升开发效率。 常用包管理工具 npm&#xff08;nodejs官方内…

百度API实现自动写诗

作者介绍 张琪&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;3126743452qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xff0…

Spring——Spring_IOC

1.Spring_IOC概念引入 控制反转 2.Spring_IOC代码测试 IOC代码演示 控制反转&#xff1a;就是创建对象的权力交给了容器 1.创建一个接口&#xff0c;定义一个抽象方法 package org.example;public interface Empdao {int addemp(); } 2.创建一个实现类&#xff0c;实现这…

两台电脑之间怎么互相传文件?

​随着技术的发展&#xff0c;我们似乎可以从家中或工作电脑远程访问另一台电脑。同时&#xff0c;一些用户也在想&#xff0c;“我能不能把文件从一台电脑远程传输到另一台电脑&#xff0c;这样我就可以在本地电脑上随心所欲地查看和编辑文件了”。 这个问题的答案是…

Android自定义一个省份简称键盘

hello啊各位老铁&#xff0c;这篇文章我们重新回到Android当中的自定义View&#xff0c;其实最近一直在搞Flutter&#xff0c;初步想法是&#xff0c;把Flutter当中的基础组件先封装一遍&#xff0c;然后接着各个工具类&#xff0c;列表&#xff0c;网络&#xff0c;统统由浅入…

PostgreSQL实战之物理复制和逻辑复制(八)

目录 PostgreSQL实战之物理复制和逻辑复制&#xff08;八&#xff09; 8 级联复制 8.1 级联复制物理架构 8.2 级联复制部署 PostgreSQL实战之物理复制和逻辑复制&#xff08;八&#xff09; 8 级联复制 实际上PostgreSQL支持备库既可接收主库发送的将WAL&#xff0c;也支持…

Java泛型基本知识附面试题

一次平平无奇的面试 为什么要写这篇文档&#xff0c;主要就是在字节二面的时候&#xff0c;面试官提了这么一个问题 面试官&#xff1a;Java中的List<Integer>里有可能存String类型元素吗&#xff1f; 当时的我&#xff1a;应该…不可以吧&#xff0c;好像编译器会报错…

2023口腔护理行业分析:市场需求多元化,细分市场持续多变

随着人们生活水平的提高以及口腔护理意识的提升&#xff0c;消费者对于口腔护理的诉求愈发多样化&#xff0c;对于与此相关的产品&#xff0c;包括牙膏、牙刷、牙齿美白产品、漱口水、牙线等产品的需求也日益提高&#xff0c;在这种情况下&#xff0c;口腔护理相关细分产品的销…

软件研发管理高效的关键:11项自动化功能

1、自动锁定需求缺陷 为了提高用户需求分析质量&#xff0c;尽早发现需求缺陷&#xff0c;CoCode开发云特开发了需求分析工具&#xff0c;使用AI&#xff0c;通过需求测试和一致性检测&#xff0c;能够在几分钟内快速分析用户需求缺陷&#xff0c;如歧义、重复、遗漏、不一致和…

深度学习神经网络学习笔记-多模态方向-09-VQA: Visual Question Answering

摘要 -我们提出了自由形式和开放式视觉问答(VQA)的任务。给定一张图像和一个关于图像的自然语言问题&#xff0c;任务是提供一个准确的自然语言答案。镜像现实场景&#xff0c;比如帮助视障人士&#xff0c;问题和答案都是开放式的。视觉问题有选择地针对图像的不同区域&#…

nodejs+vue飞机机票在线预订票网站

本机票预订系统以vue作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库&#xff0c;同时使用Tomcat用为系统的服务器。本系统主要包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;机票类型管理&#xff0c;机票信息管理&#xff0c;订票信息管理&#x…