elf檔案格式 ELF 格式詳解(一)

2021-10-12 01:20:53 字數 1831 閱讀 2209

elf 全稱 「executable and linkable format」,即可執行可鏈結檔案格式,目前常見的linux、 android可執行檔案、共享庫(.so)、目標檔案( .o)以及core 檔案(吐核)均為此格式。檔案布局

常見的elf檔案大致結構如下:

靜態鏈結器(即編譯後參與生成最終elf過程的鏈結器,如ld )會以鏈結視**析elf。編譯時生成的 .o(目標檔案)以及鏈結後的 .so (共享庫)均可通過鏈結視**析,鏈結檢視可以沒有段表(如目標檔案不會有段表)。執行檢視:

動態鏈結器(即載入器,如x86架構 linux下的 /lib/ld-linux.so.2或者安卓系統下的 /system/linker均為動態鏈結器)會以執行視**析elf並動態鏈結,執行檢視可以沒有節表。檔案頭

elf的結構宣告位於系統標頭檔案 elf.h 中,elf格式分為32位與64位兩種,除了重定位型別稍有區別,其它大致相同,為了簡化描述,後續說明將省略32/64字樣。

elf header的宣告如下 :

#define ei_nident (16)

typedef struct

elf_ehdr;

e_ident

包含了maigc number和其它資訊,共16位元組。	

0~3:前4位元組為magic number,固定為elfmag。

4(ei_class):elfclass32代表是32位elf,elfclass64 代表64位elf。

5(ei_data):elfdata2lsb代表小端,elfdata2msb代表大端。

6(ei_version):固定為ev_current(1)。

7(ei_osabi):作業系統abi標識(實際未使用)。

8(ei_abiversion):abi版本(實際 未使用)。

9~15:對齊填充,無實際意義。

e_type

elf的檔案型別,定義如下:

et_rel 可重定位文 件(如目標檔案)

et_exec 可執行檔案(可直接執行的檔案)

dt_dyn 共享目標檔案(如so庫)

dt_core core檔案(吐核檔案)

注:gcc使用編譯選項 -pie 編譯的可執行檔案實際 也是dt_dyn型別。

e_machine

e_verison

檔案版本,目前常見的elf 檔案版本均為ev_current(1)。

e_entry

入口虛擬位址。

e_phoff

段表檔案偏移。

e_shoff

節表檔案偏移。

e_flags

處理器特定的標誌,一般為0。

e_ehsize

elf_header的大小(位元組)

e_phentsize

段頭(program header)的大小(位元組)。

e_phnum

段的數量。

e_shentsize

節頭(section header)的大小(位元組)。

e_shnum

字的數量。

e_shstrndx

節字串表的節索引。

ELF檔案格式

在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...

ELF檔案格式

1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...

ELF檔案格式

elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...