C 了解部分标题ELF

C 了解部分标题ELF,c,elf,C,Elf,好的,这里的第一个函数通过使用hdr\u shoff返回指向elf节头的指针,因为这是到第一节头的偏移量。现在,第二个函数用于通过使用数组索引来访问更多的节头(如果有) 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\u shoff
返回指向elf节头的指针,因为这是到第一节头的偏移量。现在,第二个函数用于通过使用数组索引来访问更多的节头(如果有)

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];
}
我对用于访问节名的上述两个函数有问题
e->shstrndx
是字符串表的索引。因此,在
elf_str_表中
我们首先对照
SHN_UNDEF
检查它。但是在
return
中,我不明白
hdr->e_shstrndx
是字符串表的索引,如何将该索引添加到elf_节头的起始地址,从而给出另一个elf节头(我们使用它访问
sh_offset
)。我的困惑是
e->shstrndx
是一个字符串表的索引,但是这个索引和
elf_部分
如何返回指向
struct Elf32_Shdr
的指针呢


参考资料:

您自己说过,
elf_section
根据索引返回节头

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

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

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;
}
Elf32_Shdr* shstr = elf_section(hdr, hdr->e_shstrndx);
然后获取该节标题的偏移量:

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;
}
Elf32_Shdr* shstr = elf_section(hdr, hdr->e_shstrndx);
并使用它获取实际的字符串表:

int strtab_offset = shstr->sh_offset;
从该字符串表中,可以根据截面的偏移量获取截面的名称:

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

哦,我现在明白了,字符串表也是一个节,它有自己的节头,由偏移量
e_shstrndx
给出,对吗?@AbKDs:这就是它的要点,是的。谢谢@Sander De Dycker。这就是你的向上投票并接受:)@sanderedycker我在理解sh_偏移字段时遇到了一些困难。如果e_shstrndx指向具有节名称的字符串表,为什么需要使用sh_offset?@Trey:
e_shstrndx
是特定“节头”的索引(在“节头表”中)。此节头包含(除其他外)“节名字符串表”文件(
sh_offset
)中的字节偏移量。或者换句话说:节标题不包含实际的节-它们只包含查找节的位置。