文件结构:gcc -o test main.o phase1.o
可执行文件的段头表(又称程序头表)(用于描述本文件到虚拟内存的映射)
text文件的段头表如下。
上图有两个LOAD。它们的区别是权限不同。LOAD1是可读+可执行(这里面存的代表性的节就是rodata,text)。LOAD2是可读+可写(这里面存的代表性的节就是data,bss)。
LOAD1放在8048000,大小为694。LOAD2的对齐是1000,那么LOAD2从8049000开始。 把test文件(就是这个可执行文件)的f08位置字节映射到8049f08.。看节头表(在下两张图片),data是1020,那么就映射到804a020。
验证: 反汇编test文件,可以告诉我们答案。

可执行文件的节头表
test的节头表如下。
目标文件的elf头
phase1.o的elf头
目标文件的节头表
phase1.o的节头表
下图第一行写了从0x2c0开始是节头表。它怎么知道的呢?elf头中的Start of section headers:704
相当于elf头中有个指针指向节头在哪,找到了节头之后,节头里边有一堆指针,指向每个节(如data节,text节,bss节等等)。整体的物理顺序:elf,节1,节2……节n,节头表。如下图,每个节都有起始位置、长度、对齐字节。把它们串起来,就能得到所有节的物理顺序。
Addr都是0,因为这是可重定位目标文件,不是可执行文件,不会装入内存。
off是起始位置,如data从0x60开始,那么是这样吗?
反汇编的结果告诉我们数据域的开始几个字符为m uk……
用hexedit打开phase1.o,看到0x60处,对应就是m uk……
在运行时,有四个节被分配存储空间,分别是text,data,bss,rodata