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 节头(因为我们正在使用它来访问 sh_offset
)。 我困惑的是,e->shstrndx
是字符串表的索引,但是这个索引加上 elf_section
如何返回指向 struct Elf32_Shdr
的指针?
参考:http://wiki.osdev.org/ELF_Tutorial#Accessing_Section_Headers
e_shstrndx
给出,我说得对吗? - abkdse_shstrndx
是特定“节头”(在“节头表”中)的索引。该节头包含文件内“节名称字符串表”的字节偏移量(sh_offset
),以及其他信息。换句话说,节头不包含实际的节 - 它们只包含查找节的位置。 - Sander De Dycker