ELF - sh_offset字段的目的是什么?

时间:2018-05-20 06:29:25

标签: elf

我试图了解有关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

1 个答案:

答案 0 :(得分:2)

  

如果e_shstrndx已经指向字符串表部分,为什么我们需要sh_offset

e_shstrndx部分表的索引;它告诉你哪个部分描述(包含)字符串表。

但它没有告诉你数据(字符串本身)所在的位置。你需要sh_offset

这是picture.e_shoff告诉您部分表的开始位置,.e_shstrndx告诉您该表的哪个元素是您想要的那个,该元素的 .sh_offset告诉您哪里在文件.shstrtab部分的数据中(即字符串本身所在的位置)。