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

3

我正在尝试学习更多关于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;
}

现在,我理解这基本上是通过迭代部分表并打印节名称,但我仍然困惑于sh_offset字段。它到底是做什么的?如果e_shstrndx已经指向字符串表节,为什么我们需要sh_offset

1个回答

5

如果e_shstrndx已经指向字符串表节,为什么我们还需要sh_offset呢?

e_shstrndx是一个索引,指向节表;它告诉你哪个节描述(包含)了字符串表。

但它并没有告诉你数据(字符串本身)存储在哪里。你需要sh_offset来确定。

这里有一张图片.e_shoff告诉你节表从哪里开始,.e_shstrndx告诉你要找的是表中的哪个元素,而该元素.sh_offset告诉你文件中.shstrtab节的数据位于哪里(即字符串本身的位置)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接