首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解节标题ELF

理解节标题ELF
EN

Stack Overflow用户
提问于 2014-06-04 11:39:30
回答 1查看 5.3K关注 0票数 6
代码语言:javascript
复制
static inline Elf32_Shdr *elf_sheader(Elf32_Ehdr *hdr) {
    return (Elf32_Shdr *)((int)hdr + hdr->e_shoff);
}

static inline Elf32_Shdr *elf_section(Elf32_Ehdr *hdr, int idx) {
    return &elf_sheader(hdr)[idx];
}

好的,这里的第一个函数通过使用hdr_shoff返回一个指向精灵节标头的指针,因为这是对第一个节头的偏移量。现在,第二个函数仅通过使用数组索引来访问更多的节标题(如果有的话)。

代码语言:javascript
复制
static inline char *elf_str_table(Elf32_Ehdr *hdr) {
    if(hdr->e_shstrndx == SHN_UNDEF) return NULL;
    return (char *)hdr + elf_section(hdr, hdr->e_shstrndx)->sh_offset;
}

static inline char *elf_lookup_string(Elf32_Ehdr *hdr, int offset) {
    char *strtab = elf_str_table(hdr);
    if(strtab == NULL) return NULL;
    return strtab + offset;
}

我在访问节名时遇到了上述两个函数的问题。e->shstrndx是字符串表的索引。因此,在elf_str_table中,我们首先检查它与SHN_UNDEF。但在return中,我不明白hdr->e_shstrndx是字符串表的索引,如何将该索引添加到elf_section头的起始地址,从而给出另一个that节头(因为我们正在使用它来访问sh_offset )。我的困惑是e->shstrndx是字符串表的索引,但是这个索引和elf_section一起返回指向struct Elf32_Shdr的指针是怎么回事呢?

参考资料:Headers

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-04 12:09:59

您自己说过,elf_section根据索引返回节标题。

e_shstrndx是包含节头字符串表偏移量的节标头的索引。

因此,您可以使用e_shstrndx作为elf_section的参数来获取该节标题:

代码语言:javascript
复制
Elf32_Shdr* shstr = elf_section(hdr, hdr->e_shstrndx);

然后从该节标题获取偏移量:

代码语言:javascript
复制
int strtab_offset = shstr->sh_offset;

并使用它获取实际的字符串表:

代码语言:javascript
复制
char* strtab = (char*) hdr + strtab_offset;

然后,您可以从这个字符串表中获得基于它们的偏移量的节名:

代码语言:javascript
复制
char* str = strtab + offset;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24036413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档