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
答案 0 :(得分:5)
你自己说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;