一、 节头表(section header table)
在目标文件中可以包含很多“节”(section),所有这些“节”都登记在一张称为 “节头表”(section header table)的数组里。通过每一个表项可以定位到对应的节。
每一个表项结构如下:
struct Elf64_Shdr {
Elf64_Word sh_name;
Elf64_Word sh_type;
Elf64_Xword sh_flags;
Elf64_Addr sh_addr;
Elf64_Off sh_offset;
Elf64_Xword sh_size;
Elf64_Word sh_link;
Elf64_Word sh_info;
Elf64_Xword sh_addralign;
Elf64_Xword sh_entsize;
};
1. sh_name
本节的名字。整个名字的字符串并不存储在这里,它仅是一个索引号,指向 “字符串表”节中的某个位置,那里存储了一个以’\0’结尾的字符串。
在第一篇文章中的elf header中的 e_shtrndx 可以知道 节头表里面字符串表的索引。
从s_offset的0x40F5偏移 s_name_off 也就是 0x19 开始到第一个 0 结尾取出内容刚好是 .text;
2. sh_type
本节的类型。
#define SHT_NULL 0 /* 节头表条目未使用 */
#define SHT_PROGBITS 1 /* 程序数据 */
#define SHT_SYMTAB 2 /* 符号表 */
#define SHT_STRTAB 3 /* 字符串表 */
#define SHT_RELA 4 /* 带加数的重定向条目 */
#define SHT_HASH 5 /* 符号哈希表 */
#define SHT_DYNAMIC 6 /* 动态链接信息 */
#define SHT_NOTE 7 /* Notes */
#define SHT_NOBITS 8 /*