簡體   English   中英

了解節標題ELF

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM