[英]Understanding section headers 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];
}
好的,這里的第一個函數通過使用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
你自己說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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.