ELF分析(以CS:APP linkLab的文件为例)

文件结构:gcc -o test main.o phase1.o

可执行文件的段头表(又称程序头表)(用于描述本文件到虚拟内存的映射)

text文件的段头表如下。

ELF分析(以CS:APP linkLab的文件为例)_第1张图片

上图有两个LOAD。它们的区别是权限不同。LOAD1是可读+可执行(这里面存的代表性的节就是rodata,text)。LOAD2是可读+可写(这里面存的代表性的节就是data,bss)。

LOAD1放在8048000,大小为694。LOAD2的对齐是1000,那么LOAD2从8049000开始。 把test文件(就是这个可执行文件)的f08位置字节映射到8049f08.。看节头表(在下两张图片),data是1020,那么就映射到804a020。

验证: 反汇编test文件,可以告诉我们答案。

反汇编test,data节就在804a020

可执行文件的节头表 

test的节头表如下。

ELF分析(以CS:APP linkLab的文件为例)_第2张图片

目标文件的elf头

phase1.o的elf头

ELF分析(以CS:APP linkLab的文件为例)_第3张图片

目标文件的节头表 

phase1.o的节头表 

下图第一行写了从0x2c0开始是节头表。它怎么知道的呢?elf头中的Start of section headers:704

相当于elf头中有个指针指向节头在哪,找到了节头之后,节头里边有一堆指针,指向每个节(如data节,text节,bss节等等)。整体的物理顺序:elf,节1,节2……节n,节头表。如下图,每个节都有起始位置、长度、对齐字节。把它们串起来,就能得到所有节的物理顺序。

ELF分析(以CS:APP linkLab的文件为例)_第4张图片

Addr都是0,因为这是可重定位目标文件,不是可执行文件,不会装入内存。

off是起始位置,如data从0x60开始,那么是这样吗?

反汇编的结果告诉我们数据域的开始几个字符为m uk……

用hexedit打开phase1.o,看到0x60处,对应就是m uk……

在运行时,有四个节被分配存储空间,分别是text,data,bss,rodata

 

你可能感兴趣的:(linux)