【发布时间】: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
【问题讨论】: