ELF Format 筆記(二)—— ELF Header,elfheader
以 32 位的 ELF header 資料結構為例:
1 #define EI_NIDENT 16 2 typedef struct { 3 unsigned char e_ident[EI_NIDENT]; 4 Elf32_Half e_type; 5 Elf32_Half e_machine; 6 Elf32_Word e_version; 7 Elf32_Addr e_entry; 8 Elf32_Off e_phoff; 9 Elf32_Off e_shoff;10 Elf32_Word e_flags;11 Elf32_Half e_ehsize;12 Elf32_Half e_phentsize;13 Elf32_Half e_phnum;14 Elf32_Half e_shentsize;15 Elf32_Half e_shnum;16 Elf32_Half e_shstrndx;17 } Elf32_Ehdr;1、e_ident
ELF 標識。是一個 16 位元組大小的數組,其各個索引位置的位元組資料有固定的含義。
前 4 個位元組 e_ident[EI_MAG0] ~ e_ident[EI_MAG3] 的內容固定為 0x7f、’E’、’L’、’F’,標識這是一個 ELF檔案。
e_ident[EI_CLASS] 指明檔案類別:0(無效目標檔案);1(32 位目標檔案);2(64 位元目標檔案)。
e_ident[EI_DATA] 指明位元組序,規定該檔案是大端還是小端:0(無效編碼格式);1(小端);2(大端)。
e_ident[EI_VERSION] 指明 ELF 檔案頭的版本。
從 e_ident[EI_PAD] 到 e_ident[EI_NIDENT-1] 之間的 9 個位元組保留。
2、e_type
檔案類型。常見的:1(可重定位檔案:“.o 檔案”);2(可執行檔);3(共用庫檔案:“.so 檔案”)。
3、e_machine
指定該程式在什麼平台上使用,比如 EM_386 表示在 Inter x86 機器上使用。
4、e_version
ELF 檔案版本號碼。
5、e_entry
程式的入口虛擬位址。對於可執行檔來說,當 ELF 檔案載入完成後,將從這個地址開始執行。對於其它檔案,該值為 0。
6、e_phoff / e_shoff
分別指明 Program Header Table 和 Section Header Table 在檔案中的位元組位移量,沒有則為 0。
7、e_flags
處理器特定的標誌位,通常不怎麼關心。
8、e_ehsize
指明 ELF 檔案頭的位元組大小(52 個位元組)。
9、e_phentsize / e_phnum
e_phentsize 指明在 Program Header Table 中的每一項的位元組大小,e_phnum 指明共有多少項。
10、e_shentsize / e_shnum
e_shentsize 指明在 Section Header Table 中的每一項的位元組大小,e_shnum 指明共有多少項。
11、e_shstrndx
在 Section Header Table 中,儲存“節名字表”的 Section(就是 .shstrtab 節)所對應的索引。