(一) elf 檔案的格式
elf 檔案型別 (1) 可重定位檔案( .o 目標檔案) : 用於鏈結建立可執行檔案或 so 檔案
(2) 可執行檔案 : 用於執行
(3)so( 共享物件 ) 檔案 : 用於鏈結
注 : 乙個 program header 對應乙個 segment
乙個 section header 對應乙個 section
segment 由 section 構成
segment 型別 :#define pt_null 0 unused
#definept_load1可載入段 ( **節和資料節 )
#definept_dynamic2動態鏈結段 ( 動態鏈結資訊 )
#definept_interp3直譯器段 ( 動態鏈結器路徑 )
#define pt_note 4 auxiliary information
#define pt_shlib 5 reserved - purpose undefined
#define pt_phdr 6 program header
#define pt_num 7 number of segment types
#define pt_loos 0x60000000 reserved range for os
#define pt_hios 0x6fffffff specific segment types
#define pt_loproc 0x70000000 reserved range for processor
#define pt_hiproc 0x7fffffff specific segment types
section 型別 : #define elf_bss ".bss" uninitialized data
#define elf_data ".data"資料節initialized data
#define elf_debug ".debug" debug
#define elf_dynamic ".dynamic"動態鏈結節dynamic linking information
#define elf_dynstr ".dynstr" dynamic string table
#define elf_dynsym ".dynsym" dynamic symbol table
#define elf_fini ".fini" termination code
#define elf_got ".got" global offset table
#define elf_hash ".hash" symbol hash table
#define elf_init ".init" initialization code
#define elf_rel_data ".rel.data" relocation data
#define elf_rel_fini ".rel.fini" relocation termination code
#define elf_rel_init ".rel.init" relocation initialization code
#define elf_rel_dyn ".rel.dyn" relocaltion dynamic link info
#define elf_rel_rodata ".rel.rodata" relocation read-only data
#define elf_rel_text ".rel.text" relocation code
#define elf_rodata ".rodata" read-only data
#define elf_shstrtab ".shstrtab" section header string table
#define elf_strtab ".strtab" string table
#define elf_symtab ".symtab" symbol table
#define elf_text ".text"**節code
(二) elf 檔案的載入過程
原始檔 trunk/system/elfloader/dll/elfloader.c
loadelfexec() 函式
載入的具體過程
1. 開啟檔案open_library(char* filename)
系統呼叫 open(): 建立 file 結構體 , 放入程序開啟檔案表 , 返回 ( 開啟檔案表 ) 下標
2. 讀出檔案頭和程式頭表iselfformat(file)
讀出 elf 檔案頭 ( 同時讀出了程式頭表 program header table), 判斷 elf 格式根據檔案頭中的e_ident 來比較判斷 .
3. 載入檔案load_library(char * filename,int fd)
(1) 計算所有 segment 占用記憶體大小get_lib_extents()
通過遍歷程式頭表 (program header table), 算出所有 segment 將占用的記憶體大小extents_size
(2) 分配記憶體alloc_mem_region(extents_size)
匿名對映一塊非共享的私有記憶體 ( 不涉及檔案 )
(3) 分配 soinfo 結構體alloc_info(char *filename)
從全域性靜態 soinfo 結構體陣列中分配 soinfo 結構體 ( 描述整個 elf 檔案 )
(4) 載入 segment
load_segment(int fd,void* header,soinfo*si)
(1) 可載入段 (pt_load): 對映到記憶體
mmap(void * start,size_t len, int prot,int flags,int fd,off_t offsize)
把 elf 檔案 offsize 處的 segment 對映到已分配記憶體的 start 處
(2) 動態鏈結段
由動態鏈結節設定 soinfo 中的動態鏈結資訊
(5) 設定 soinfo 結構體
4. 載入依賴的動態鏈結庫
5.重定位(自身符號)
重定位表項: elf32_addr r_offset (重定位)記憶體位址(offset of relocation)
elf32_word r_info 符號表下標和型別(symbol table index and type)
符號表項: elf32_word st_name 符號名(name - index into string table)
elf32_addr st_value 符號值(symbol value)
elf32_word st_size symbol size
unsigned char st_info type and binding
unsigned char st_other 0 - no defined meaning
elf32_half st_shndx; section header index
根據重定位表(表項)查符號表,得到符號記憶體位址,修改(重定位)記憶體值
最後得到soinfo結構體陣列描述了所有載入的檔案
6.如果入口位址不為零,呼叫入口函式
ELF檔案的格式和載入過程
一 elf 檔案的格式 elf 檔案型別 1 可重定位檔案 o 目標檔案 用於鏈結建立可執行檔案或 so 檔案 2 可執行檔案 用於執行 3 so 共享物件 檔案 用於鏈結 注 乙個 program header 對應乙個 segment 乙個 section header 對應乙個 section...
elf檔案格式 ELF 格式詳解(一)
elf 全稱 executable and linkable format 即可執行可鏈結檔案格式,目前常見的linux android可執行檔案 共享庫 so 目標檔案 o 以及core 檔案 吐核 均為此格式。檔案布局 常見的elf檔案大致結構如下 靜態鏈結器 即編譯後參與生成最終elf過程的鏈...
ELF檔案格式
在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...