Section header(Shdr)
通过section header table能够定位文件所有的section。section headertable 的格式是Elf32_Shdr或者Elf64_Shdr。
ELF header 的e_shooff字段是section header table从文件开始位置的偏移量。e_shnum是section header tables的数量。
e_shentsize保存的是一个的大小。
一个section header table的索引号是数组的下标。有些索引号是保留的:initial entry和索引号在SHN_LORESERVE和
SHN_HIRESERVER之间的。initial entry是给ELF扩展e_phnum,e_shnum和e_strndx使用的;其他情况,initial entry是全为
0的。一个object file没有下面这些索引号的section:
SHN_UNDEF
此值标记未定义、丢失、不相关或无意义的节引用。
SHN_LORESERVE
此值指定保留索引范围的下限。
SHN_LOPROC,SHN_HIPROC
包含范围[shn_loproc,shn_hiproc]中较大的值是为特定于处理器的语义保留的。
SHN_ABS
此值指定对应引用的绝对值。例如,一个定义为SHN_ABS的节有绝对地址,不受重新定位的影响。
SHN_COMMON
定义为此的节就是普通的symbols,例如FORTRAN COMMON或者未分配的C外部变量。
SHN_HIRESERVER
此值指定保留索引范围的上限。系统保留的索引号区间就在SHN_LORESERVE和SHN_HIRESERVER之间。section header table不包含在保留索引号区间内的entry。
section header table的结构体如下:
typedef struct {
uint32_t sh_name;
uint32_t sh_type;
uint32_t sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
uint32_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint32_t sh_addralign;
uint32_t sh_entsize;
} Elf32_Shdr;
typedef struct {
uint32_t sh_name;
uint32_t sh_type;
uint64_t sh_flags;
Elf64_Addr sh_addr;
Elf64_Off sh_offset;
uint64_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint64_t sh_addralign;
uint64_t sh_entsize;
} Elf64_Shdr;
32位和64位之间没有本质区别。
sh_name 对该节的内容和语义进行分类。
SHT_NULL 表示section header是不活跃的。没有和一个section相关联。section header的其他成员无意义。
SHT_PROGBITS 保存的是程序的一些信息,并且只由程序决定它的格式和意义。
SHT_SYMTAB 保存的是一个symbols table,也就是符号表。最典型的是提供链接使用的symbols,当然动态
链接有时候也用。作为一个完整的符号表,要包含很多为动态链接使用的没有必要的符号表们。
一个object file也可以包含SHN_DYNSYM section。
SHN_STRTAB 保存的是一个字符串表。一个object file没准包含很多的string table sections。
SHT_RELA 保存的是relocation entries with explicit addends(显示加法的重定向入口?)就像给32位
系统使用的Elf32_Rela.一个object也许包含多个此节。
SHNT_HASH 保存的是符号hash table。参与动态链接的object肯定包含一个symbol hash table。一个object
file没准只包含一个hash table。
SHT_DYNAMIC 保存的是给动态链接使用的信息。一个object file没准只包含一个dynamic section。
SHT_NOTE This section holds notes (ElfN_Nhdr).
SHT_NOBITS 这种类型的部分在文件中不占用空间,但在其他方面类似于SHT_PROGBITS。尽管此节不占用空 间,sh_offset保存的是conceptual(概念的) file的偏移量。
SHT_REL 和SHT_RELA类似,不过是without。就像给32位系统使用的Elf32_Rel。一个object file也许包含
多个此节。
SHT_SHLIB 保留的但是由未指定的语义。
SHT_DYNSYM 这个section保存的是动态链接符号的最小设置。一个object也可以包含一个SHT_SYMTAB节。
SHT_LOPROC,SHT_HIPROC
[SHT_LOPROC, SHT_HIPROC]区间是为特定于处理器的语义保留的。
SHT_LOUSER 为应用程序保留的索引号最小值。
SHT_HIUSER 为应用程序保留的索引号最大值。[SHT_LOUSER,SHT_HIUSER]区间是为应用程序使用的。不会和 现在的或者以后的系统定义的section type冲突。
sh_flags
按位表示多种多样的参数。如果一个标志位被set,那么这个参数就是on的状态。否则这个参数就是off或者not apply
未定义的参数置零。
SHF_WRITE 此节包含在程序执行期间可写的数据。
SHF_ALLOC 此节在程序执行期间占用内存。一些control sections在object file在内存中的镜像中不存在。这些
节中this attribute is off.
SHF_EXECINSTR 包含可执行的机器指令。
SHF_MASKPROC 这个掩码中包含的所有位都保留给特定于处理器的语义。
sh_addr 如果这个节在程序在内存的镜像中出现了,那么它保存的是section‘s的第一个字节的地址。否则就是0.
sh_offset
保存的是segment从文件开始的偏移量。SHT_NOBITS类型在文件中不占用空间,它的sh_offset定位在文件中
的概念位置。
sh_size section的大小,除了SHT_NOBITS类型。SHT_NOBITS类型的此字段不为零,但是在文件中不占用空间。
sh_link 保存的是section header table index link,具体意思要看section type。
sh_info 保存的是额外信息,具体意思要看section type。
sh_addralign
有些section有字节对齐约束。如果是doubleword,那系统必须确保doubleword alignment for the entire
section。也就是说sh_addr必须全为零。如果是modulo the value,那么只有0和2的正整数次方是有效的。
如果这个值为0或者1,那么这个section就没有字节对齐的要求。
sh_entsize
有些section保存的是固定大小的条目,例如symbol table。这类section,sh_entsize给出的是每个条目的
大小。如果section没有保存a table of fixed-size entries,那么sh_entsize为0.