ELF 文件格式
linux Elf 文件格式,windows pe文件
ELF 文件由三部分組成: ELF文件頭(位置固定,大小也是固定的),段頭表,節(jié)頭表
ELF文件頭
16進制顯示
7F 起始 45 4C 46 ELF對應ASCII碼
ELF 文件整體結(jié)構(gòu):
ELF Header -> ELF 文件頭的位置是固定的
Segment Header Table -> ELF程序頭描述的段的相關(guān)信息
.shstrtab 該section包含了節(jié)的名稱
.bss 該section包含了在內(nèi)存中程序的未初始化的數(shù)據(jù),當程序運行開始時,系統(tǒng)將用0來初始化該區(qū)域。該section不占用文件空間,該section type = SHT_NOBITS
.init
.text 可執(zhí)行區(qū)域(代碼)
.rodata 只讀數(shù)據(jù)
.data 和.data1 該section 包含了在內(nèi)存中程序的初始化數(shù)據(jù)
.debug 該section包含了符號調(diào)試信息
.dynamic 該section包含了動態(tài)鏈接信息,該section屬性將包含SHF_ALLOC比特位,而SHF_WRITE比特位是否為1取決于處理器
.dynsym 該section包含了動態(tài)鏈接符號表
.fini 該section 包含了用于終止進程可執(zhí)行指令代碼
.symtab
.hash 包含了符號hash表
.line
.strtab 字符串表
.got 包含了全局偏移表
.plt 程序鏈接表
Section Header Table --> ELF 節(jié)頭表描述的是節(jié)區(qū)的信息 動態(tài)用段,靜態(tài)是節(jié)區(qū)
程序加載的時候只會加載LOAD 段
[圖片上傳失敗...(image-2b3061-1574847164757)]
)
ELF 常用的數(shù)據(jù)格式:
[圖片上傳失敗...(image-69c5aa-1574847164757)]
)
readelf 的使用:
-a 所有信息
-h 頭信息 magic type 段頭表,類型, 段頭偏移等
-l
-S 節(jié)(動態(tài)叫段)
-e
程序加載和動態(tài)鏈接
實現(xiàn)程序加載和動態(tài)鏈接的主要技術(shù)有:
程序頭部(Program Header):描述與程序執(zhí)行直接相關(guān)的目標文件結(jié)構(gòu)信息。用來在文件中定位各個段的映像。
同時包含其他一些用來為程序創(chuàng)建進程映像所必須的信息。
程序加載:給定一個目標文件,系統(tǒng)加載該文件到內(nèi)存,啟動程序執(zhí)行。
動態(tài)鏈接:系統(tǒng)加載了程序以后,必須通過解析構(gòu)成進程的目標文件之間的符號引用,以便完整地的構(gòu)造進程映像.
DEX 文件格式
開始:64 65 78 0A 30 35 00
整體格式概要

image
DexFile整體文件結(jié)構(gòu)
DexHeader header;
DexStringId StringIds[stringIdsSize]
DexTypeId
DexProtoId
DexFieldId
DexMethodId
DexClassDef ClassDefs[]
DexData Data[] 數(shù)據(jù)
DexLink LinkData 鏈接
DexHeader
u1 magic[8] u幾就是表明占位幾個字節(jié) 版本信息
u4 checkSum 文件的校驗值 alder 32字節(jié)
u1 signature 簽名驗證(sha-1)
u4 fileSize 整個文件大小
u4 headerSize //文件頭的大小
u4 linkSize //鏈接段的大小
u4 mapOff //DexMapList文件偏移
u4 fieldIdsOff
....
u4 classDefsSize
u4 classDefsOff
DexClassDef
classDefsSize 和 classDefsOff來表示 DexClassDef
struct DexClassDef{
u4 classIdx;
u4 accessFlags;
u4 superClassIdx;
u4 interfaceFileIdx;
}
詳細見如下圖:

image
文件格式相互之間的聯(lián)系

image
Dex文件結(jié)構(gòu)體
詳細鏈接安卓源碼