前文链接:
下面我们依次讲解结构体各个字段:
-
sh_name,4字节,是一个索引值,在shstrtable(section header string table,包含section name的字符串表,也是一个section)中的索引。第二讲介绍ELF文件头时,里面专门有一个字段e_shstrndx,其含义就是shstrtable对应的section header在section header table中的索引。 -
sh_type,4字节,描述了section的类型,常见的取值如下:SHT_NULL0,表明section header无效,没有关联的section。SHT_PROGBITS1,section包含了程序需要的数据,格式和含义由程序解释。SHT_SYMTAB2, 包含了一个符号表。当前,一个ELF文件中只有一个符号表。SHT_SYMTAB提供了用于(link editor)链接编辑的符号,当然这些符号也可能用于动态链接。这是一个完全的符号表,它包含许多符号。SHT_STRTAB3,包含一个字符串表。一个对象文件包含多个字符串表,比如.strtab(包含符号的名字)和.shstrtab(包含section的名称)。SHT_RELA4,重定位节,包含relocation入口,参见Elf32_Rela。一个文件可能有多个Relocation Section。比如.rela.text,.rela.dyn。SHT_HASH5,这样的section包含一个符号hash表,参与动态连接的目标代码文件必须有一个hash表。目前一个ELF文件中只包含一个hash表。讲链接的时候再细讲。SHT_DYNAMIC6,包含动态链接的信息。目前一个ELF文件只有一个DYNAMIC section。SHT_NOTE7,note section, 以某种方式标记文件的信息,以后细讲。SHT_NOBITS8,这种section不含字节,也不占用文件空间,section header中的sh_offset字段只是概念上的偏移。SHT_REL9, 重定位节,包含重定位条目。和SHT_RELA基本相同,两者的区别在后面讲重定位的时候再细讲。SHT_SHLIB10,保留,语义未指定,包含这种类型的section的elf文件不符合ABI。SHT_DYNSYM11, 用于动态连接的符号表,推测是symbol table的子集。SHT_LOPROC0x70000000 到SHT_HIPROC0x7fffffff,为特定于处理器的语义保留。SHT_LOUSER0x80000000 andSHT_HIUSER0xffffffff,指定了为应用程序保留的索引的下界和上界,这个范围内的索引可以被应用程序使用。
-
sh_flags, 32位占4字节, 64位占8字节。包含位标志,用readelf -S <elf>可以看到很多标志。常用的有:SHF_WRITE0x1,进程执行的时候,section内的数据可写。SHF_ALLOC0x2,进程执行的时候,section需要占据内存。SHF_EXECINSTR0x4,节内包含可以执行的机器指令。SHF_STRINGS0x20,包含0结尾的字符串。SHF_MASKOS0x0ff00000,这个mask为OS特定的语义保留8位。
-
