《程序员的自我修养》读书笔记:ELF文件结构描述

用readelf命令详细查看ELF文件

《程序员的自我修养》读书笔记:ELF文件结构描述_第1张图片

Entry point address: 0x0 

入口地址,规定ELF程序的入口虚拟地址,OS在加载完该程序后从这个地址开始执行进程的指令。

可重定位文件(Type: REL)一般没有入口地址,则这个值为0.

Start of section headers: 280(bytes into file)

段表在文件中的偏移。

-------------------------------------------------------------------------------------------------------------------

段表(Section Header Table)保存ELF文件中段的基本属性的结构。

编译器、链接器和装载器都是依靠段表来定位和访问各个段的属性的。

查看段表结构

《程序员的自我修养》读书笔记:ELF文件结构描述_第2张图片

段表是一个以“Elf32_Shdr”结构体为元素的数组。每个“Elf32_Shdr”(段描述符)结构体对应一个段。

《程序员的自我修养》读书笔记:ELF文件结构描述_第3张图片

sh_name 段名是个字符串,位于一个叫做“.shstrtab”的字符串表。sh_name是段名字符串在“.shstrtab”中的偏移。

sh_addr 如果该段可以被加载,则sh_addr为该段被加载后在进程地址空间中的虚拟地址;否则为0.

sh_offest 若该段存在于文件中,表示该段在文件中的偏移;否则无意义(如BSS段)。

最后一个段偏移为0X508,大小为0X10,所以SimpleSection.o的大小为0X518。

----------------------------------------------------------------------------------------------------------------------------------

重定位表

链接器在处理目标文件时,须要对目标文件中的某些部位进行重定位,即代码段和数据段中的那些对绝对地址的引用的位置。

这些重定位的信息都记录在ELF文件的重定位表里面。

对于每个需要重定位的代码段或数据段,都会有一个相应的重定位表。如".rel.text"是针对".text"段的重定位表。

----------------------------------------------------------------------------------------------------------------------------------

字符串表

因为字符串的长度往往是不定的,所以用固定的结构来表示它比较困难。

常见做法:把字符串集中起来存放到一个表,然后用字符串在表中的偏移来引用。

".strtab" 字符串表,保存普通的字符串

".shstrtab" 段表字符串表,用来保存段表中用到的字符串,如段名。

第一张图的Section header string table index:10 为".shstrtab"在段表中的下标。

你可能感兴趣的:(《程序员的自我修养-链接,装载与库》笔记)