ELF - sh_offset 字段的用途是什么?

Tre*_*rey 3 elf

我正在尝试了解有关 ELF 格式的更多信息,特别是节标题,我刚刚遇到了以下内容:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道这基本上是遍历节表并打印节名称,但我仍然对sh_offset字段感到困惑。它到底有什么作用?如果e_shstrndx已经指向字符串表部分,为什么我们需要sh_offset

Emp*_*ian 5

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

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

但它不会告诉您数据(字符串本身)所在的位置。你需要sh_offset那个。

这是一张图片.e_shoff告诉您节表的开始位置,.e_shstrndx告诉您该表的哪个元素是您想要的元素,并且该元素 .sh_offset告诉您文件.shstrtab节的数据在哪里(即字符串本身在哪里)。