ELF文件中又各式各样的段,段表(Section Header Table)就是保存这些段的基本属性
的结构。段表是ELF文件中除了文件头之外最重要的结构,它描述了ELF的各个段的信息,
比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。
可以用readelf -S *.o来查看可执行文件中的各个段,
段表的结构比较简单,它是以“Elf32_Shdr”结构体为元素的数组,数组元素的个数等于
段的个数,每个“Elf32_Shdr”结构体对应一个段,该结构体又称为段描述符(Section Descriptor).
ELF段表的这个数组第一个元素是无效的段描述符,它的类型为NULL.
ELF_Shdr的结构如下所示:
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
}Elf32_Shdr;
段的名字(sh_name)
段名是一个字符串,它位于一个叫做“.shstrtab”的字符串表。sh_name是段名
字符串在“.shstrtab”中的偏移。
段的名字对于编译器、链接器来说是有意义的,但是对于操作系统来说并没有
实质意义,对于操作系统,一个段该如何处理取决于它的属性和权限,即由段的类型
和标志位这两个成员来决定。
段的类型(sh_type)
段的类型相关常量以SHT_开头,例如:
SHT_NULL 0 无效段
SHT_PROGBITS 1 程序段。代码段和数据段都是这种类型。
SHT_SYMTAB 2 该段的内容为符号表
SHT_STRTAB 3 该段的内容为字符串表
SHT_RELA 4 重定位表
SHT_NOBITS 8 该段在文件中没有内容
SHT_REL 9 该段包含了重定位信息
SHT_DYNAMIC 6 动态链接信息
段的标志位(sh_flags)
段的标志位表示该段在进程虚拟地址空间中的属性,比如是否可写、可执行等。
相关常量以SHF_开头。
SHF_WRITE 1 该段在进程空间中可写
SHF_ALLOC 2 该段在进程空间中需要分配空间。有些包含指示或者控制信息
的段不需要在进程空间中被分配空间,他们一般不会有这个标志。
而代码段、数据段和.bss段都会有这个标志位。
SHF_EXECINSTR 4 该段在进程空间中可以被执行,一般指代码段。