ELF檔案的格式和載入過程

2021-09-07 11:33:45 字數 4654 閱讀 6815

(一) 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 用彙編器 ...