Linux下ELF文件簡單介紹
引言
最開始有在樹莓派中看見ELF文件,故在此進行記錄
ELF文件介紹
Executable and Linkable Format 可執(zhí)行鏈接格式(ELF),是Unix系統(tǒng)實驗室(USL)作為應用程序二進制接口而開發(fā)和發(fā)布的。
ELF目標文件有三種類型:
-
可重定位文件:保存代碼和適當?shù)臄?shù)據(jù),用來和其他
object文件一起創(chuàng)建一個可執(zhí)行文件或共享文件 -
可執(zhí)行文件:保存一個用來執(zhí)行的程序,該文件指出了如何來創(chuàng)建程序進程映像
-
共享目標文件:包含了在兩種使用環(huán)境中鏈接的代碼和數(shù)據(jù)。
- 首先,鏈接器(
ld)可以將它和其余可重定位文件和共享目標文件一起處理,生成另外一個目標文件 - 其次,動態(tài)鏈接器可將它與某個可執(zhí)行文件以及其他共享目標文件按組合在一起創(chuàng)建進程映像
- 首先,鏈接器(
三種類型的ELF文件結(jié)構(gòu)都是相同的
ELF文件的結(jié)構(gòu)
主要由四部分組成:
ELF headerProgram header tableSectionsSection header table
ELF header
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT]; //占用16個字節(jié)
Elf32_Half e_type; //Elf32_Half表示是2個字節(jié)大小,代表文件的類型
Elf32_Half e_machine; //代表運行該程序需要的體系結(jié)構(gòu)
Elf32_Word e_version; //Elf32_Word表示4個字節(jié)大小,代表文件版本
Elf32_Addr e_entry; //Elf32_Addr表示4個字節(jié)大小,代表程序的入口地址
Elf32_Off e_phoff; //Elf32_Off表示4個字節(jié)大小,是`Program header table`在文件中的偏移量
Elf32_Off e_shoff; //是`Section header table`在文件中的偏移量
Elf32_Word e_flags; //保存著相關(guān)文件的特定處理器信息
Elf32_Half e_ehsize; //表示`ELF header`的大小
Elf32_Half e_phentsize; //表示`Program header table`中每一個條目的大小
Elf32_Half e_phnum; //表示`program header table`中有多少個條目
Elf32_Half e_shentsize; //表示`Section header table`中每一個條目的大小
Elf32_Half e_shnum; //表示`Section header table`中有多少個條目
Elf32_Half e_shstrndx; //保存著字符表相關(guān)入口的節(jié)區(qū)頭部表索引
}Elf32_Ehdr;
Section header table
typedef struct{
Elf32_Word sh_name; //節(jié)區(qū)名,是節(jié)區(qū)頭部字符串表節(jié)區(qū)(Section Header String Table Section)的索引。名字是一個 NULL 結(jié)尾的字符串。
Elf32_Word sh_type; //為節(jié)區(qū)類型
Elf32_Word sh_flags; //節(jié)區(qū)標志
Elf32_Addr sh_addr; //如果節(jié)區(qū)將出現(xiàn)在進程的內(nèi)存映像中,此成員給出節(jié)區(qū)的第一個字節(jié)應處的位置。否則,此字段為 0。
Elf32_Off sh_offset; //此成員的取值給出節(jié)區(qū)的第一個字節(jié)與文件頭之間的偏移。
Elf32_Word sh_size; //此 成 員 給 出 節(jié) 區(qū) 的 長 度 ( 字 節(jié) 數(shù) )。
Elf32_Word sh_link; //此成員給出節(jié)區(qū)頭部表索引鏈接。其具體的解釋依賴于節(jié)區(qū)類型。
Elf32_Word sh_info; //此成員給出附加信息,其解釋依賴于節(jié)區(qū)類型。
Elf32_Word sh_addralign; //某些節(jié)區(qū)帶有地址對齊約束.
Elf32_Word sh_entsize; //某些節(jié)區(qū)中包含固定大小的項目,如符號表。對于這類節(jié)區(qū),此成員給出每個表項的長度字節(jié)數(shù)。
}Elf32_Shdr;
Program header table
typedef struct {
Elf32_Word p_type; //此數(shù)組元素描述的段的類型,或者如何解釋此數(shù)組元素的信息。
Elf32_Off p_offset; //此成員給出從文件頭到該段第一個字節(jié)的偏移
Elf32_Addr p_vaddr; //此成員給出段的第一個字節(jié)將被放到內(nèi)存中的虛擬地址
Elf32_Addr p_paddr; //此成員僅用于與物理地址相關(guān)的系統(tǒng)中。System V忽略所有應用程序的物理地址信息。
Elf32_Word p_filesz; //此成員給出段在文件映像中所占的字節(jié)數(shù)。可以為0。
Elf32_Word p_memsz; //此成員給出段在內(nèi)存映像中占用的字節(jié)數(shù)。可以為0。
Elf32_Word p_flags; //此成員給出與段相關(guān)的標志。
Elf32_Word p_align; //此成員給出段在文件中和內(nèi)存中如何對齊。
} Elf32_phdr;
總結(jié)
這個也只是簡單的介紹了一下ELF文件,并沒有對該文件進行具體的分析 我好菜
如果需要更細致的分析,請點擊參考鏈接

浙公網(wǎng)安備 33010602011771號