我试图了解有关ELF格式的更多信息,尤其是章节标题,我只是came across以下内容:
Elf32_Ehdr *ehdr = (Elf32_Ehdr*)p;
Elf32_Shdr *shdr = (Elf32_Shdr *)(p + ehdr->e_shoff);
int shnum = ehdr->e_shnum;
Elf32_Shdr *sh_strtab = &shdr[ehdr->e_shstrndx];
const char *const sh_strtab_p = p + sh_strtab->sh_offset;
for (int i = 0; i < shnum; ++i) {
printf("%2d: %4d '%s'\n", i, shdr[i].sh_name,
sh_strtab_p + shdr[i].sh_name);
}
return 0;
}
现在,我知道这基本上是通过节表迭代并打印节名,但我仍然对 sh_offset 字段感到困惑。它到底是做什么用的?如果 e_shstrndx 已经指向字符串表部分,为什么我们需要 sh_offset ?
答案 0 :(得分:2)
如果e_shstrndx已经指向字符串表部分,为什么我们需要sh_offset
e_shstrndx
是部分表的索引;它告诉你哪个部分描述(包含)字符串表。
但它没有告诉你数据(字符串本身)所在的位置。你需要sh_offset
。
这是picture。 .e_shoff
告诉您部分表的开始位置,.e_shstrndx
告诉您该表的哪个元素是您想要的那个,该元素的 .sh_offset
告诉您哪里在文件.shstrtab
部分的数据中(即字符串本身所在的位置)。