了解节标题ELF

abk*_*kds 4 c 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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

我遇到上述两个用于访问节名称的函数的问题.e->shstrndx是字符串表的索引.所以在elf_str_table我们首先检查它SHN_UNDEF.但是return我不明白那hdr->e_shstrndx是字符串表的索引,如何将该索引添加到elf_section标头的起始地址,给出另一个elf节标题(因为我们正在使用它访问sh_offset).我的困惑是它e->shstrndx是一个字符串表的索引,但是这个索引如何以及elf_section返回指针struct Elf32_Shdr

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

San*_*ker 5

你说你自己elf_section返回一个基于索引的节头.

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

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

Elf32_Shdr* shstr = elf_section(hdr, hdr->e_shstrndx);
Run Code Online (Sandbox Code Playgroud)

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

int strtab_offset = shstr->sh_offset;
Run Code Online (Sandbox Code Playgroud)

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

char* strtab = (char*) hdr + strtab_offset;
Run Code Online (Sandbox Code Playgroud)

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

char* str = strtab + offset;
Run Code Online (Sandbox Code Playgroud)