用readelf命令详细查看ELF文件
Entry point address: 0x0
入口地址,规定ELF程序的入口虚拟地址,OS在加载完该程序后从这个地址开始执行进程的指令。
可重定位文件(Type: REL)一般没有入口地址,则这个值为0.
Start of section headers: 280(bytes into file)
段表在文件中的偏移。
-------------------------------------------------------------------------------------------------------------------
段表(Section Header Table)保存ELF文件中段的基本属性的结构。
编译器、链接器和装载器都是依靠段表来定位和访问各个段的属性的。
查看段表结构
段表是一个以“Elf32_Shdr”结构体为元素的数组。每个“Elf32_Shdr”(段描述符)结构体对应一个段。
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"在段表中的下标。