【Linux0.11代码分析】10 之 ELF可执行程序03 - Program Headers解析
- 一、ELF概述
- 二、ELF的组成结构
- 2.1 ELF header:解析出 section headers 含31个section节和 program headers 含13个segment段
- 2.2 Section Headers:获取当前程序的31个section节区信息
- 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解析》
10.《【Linux0.11代码分析】10 之 ELF可执行程序03 - Program Headers解析》
本文承接前文:《【Linux0.11代码分析】08 之 ELF可执行程序01 - ELF header解析》 和 《【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析》
一、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节区信息
见:《【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析》
2.3 Program Headers:解析13个segment段 及 对应的虚拟地址和物理地址
描述了各个 segment 段的虚拟地址 和 物理地址,及其对应的权限 RW
Program Headers:Type Offset VirtAddr PhysAddrFileSiz MemSiz Flags AlignPHDR 0x0000000000000040 0x0000000000000040 0x00000000000000400x00000000000002d8 0x00000000000002d8 R 0x8INTERP 0x0000000000000318 0x0000000000000318 0x00000000000003180x000000000000001c 0x000000000000001c R 0x1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD 0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000628 0x0000000000000628 R 0x1000LOAD 0x0000000000001000 0x0000000000001000 0x00000000000010000x00000000000001e5 0x00000000000001e5 R E 0x1000LOAD 0x0000000000002000 0x0000000000002000 0x00000000000020000x000000000000012c 0x000000000000012c R 0x1000LOAD 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000258 0x0000000000000260 RW 0x1000DYNAMIC 0x0000000000002dc8 0x0000000000003dc8 0x0000000000003dc80x00000000000001f0 0x00000000000001f0 RW 0x8NOTE 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000030 0x0000000000000030 R 0x8NOTE 0x0000000000000368 0x0000000000000368 0x00000000000003680x0000000000000044 0x0000000000000044 R 0x4GNU_PROPERTY 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000030 0x0000000000000030 R 0x8GNU_EH_FRAME 0x0000000000002024 0x0000000000002024 0x00000000000020240x000000000000003c 0x000000000000003c R 0x4GNU_STACK 0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000 RW 0x10GNU_RELRO 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000248 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...0001 .interp02 .interp .note.gnu.property .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt03 .init .plt .plt.got .plt.sec .text .fini04 .rodata .eh_frame_hdr .eh_frame05 .init_array .fini_array .dynamic .got .data .bss06 .dynamic07 .note.gnu.property08 .note.gnu.build-id .note.ABI-tag09 .note.gnu.property10 .eh_frame_hdr1112 .init_array .fini_array .dynamic .got