【问题标题】:Understanding section headers ELF了解节标题 ELF
【发布时间】:2014-06-04 11:39:30
【问题描述】:
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 返回指向 elf 节头的指针,因为这是第一个节头的偏移量。现在第二个函数用于访问更多的节标题(如果有的话),只需使用数组索引。

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 标头的起始地址的,从而给出另一个elf 节标头(因为我们正在使用它访问@987654330 @)。我的困惑是 e->shstrndx 是一个字符串表的索引,但是这个索引和 elf_section 是如何返回一个指向 struct Elf32_Shdr 的指针?

参考:http://wiki.osdev.org/ELF_Tutorial#Accessing_Section_Headers

【问题讨论】:

    标签: c elf


    【解决方案1】:

    你自己说过elf_section会根据索引返回一个节标题。

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

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

    Elf32_Shdr* shstr = elf_section(hdr, hdr->e_shstrndx);
    

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

    int strtab_offset = shstr->sh_offset;
    

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

    char* strtab = (char*) hdr + strtab_offset;
    

    从此字符串表中,您可以根据它们的偏移量获取节的名称:

    char* str = strtab + offset;
    

    【讨论】:

    • 哦我现在明白了,字符串表也是一个有它自己的部分标题的部分,它由偏移量e_shstrndx 给出,对吗?
    • @AbKDs :这就是它的要点,是的。
    • 感谢@Sander De Dycker。你去投票并接受:)
    • @SanderDeDycker 我在理解 sh_offset 字段时遇到了一些麻烦。如果 e_shstrndx 是指向带有节名的字符串表,为什么我们需要使用 sh_offset?
    • @Trey : e_shstrndx 是特定“节头”的索引(在“节头表”内)。此节标题包含(除其他外)“节名称字符串表”的文件 (sh_offset) 中的字节偏移量。或者换句话说:节标题不包含实际的节 - 它们只包含在哪里可以找到该节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多