ELF 和DEX 文件格式详解
2019-11-27 本文已影响0人
le_du
ELF 文件格式
linux Elf 文件格式,windows pe文件
ELF 文件由三部分组成: ELF文件头(位置固定,大小也是固定的),段头表,节头表
ELF文件头
16进制显示
7F 起始 45 4C 46 ELF对应ASCII码
ELF 文件整体结构:
ELF Header -> ELF 文件头的位置是固定的
Segment Header Table -> ELF程序头描述的段的相关信息
.shstrtab 该section包含了节的名称
.bss 该section包含了在内存中程序的未初始化的数据,当程序运行开始时,系统将用0来初始化该区域。该section不占用文件空间,该section type = SHT_NOBITS
.init
.text 可执行区域(代码)
.rodata 只读数据
.data 和.data1 该section 包含了在内存中程序的初始化数据
.debug 该section包含了符号调试信息
.dynamic 该section包含了动态链接信息,该section属性将包含SHF_ALLOC比特位,而SHF_WRITE比特位是否为1取决于处理器
.dynsym 该section包含了动态链接符号表
.fini 该section 包含了用于终止进程可执行指令代码
.symtab
.hash 包含了符号hash表
.line
.strtab 字符串表
.got 包含了全局偏移表
.plt 程序链接表
Section Header Table --> ELF 节头表描述的是节区的信息 动态用段,静态是节区
程序加载的时候只会加载LOAD 段
[图片上传失败...(image-2b3061-1574847164757)]
)
ELF 常用的数据格式:
[图片上传失败...(image-69c5aa-1574847164757)]
)
readelf 的使用:
-a 所有信息
-h 头信息 magic type 段头表,类型, 段头偏移等
-l
-S 节(动态叫段)
-e
程序加载和动态链接
实现程序加载和动态链接的主要技术有:
程序头部(Program Header):描述与程序执行直接相关的目标文件结构信息。用来在文件中定位各个段的映像。
同时包含其他一些用来为程序创建进程映像所必须的信息。
程序加载:给定一个目标文件,系统加载该文件到内存,启动程序执行。
动态链接:系统加载了程序以后,必须通过解析构成进程的目标文件之间的符号引用,以便完整地的构造进程映像.
DEX 文件格式
开始:64 65 78 0A 30 35 00
整体格式概要
imageDexFile整体文件结构
DexHeader header;
DexStringId StringIds[stringIdsSize]
DexTypeId
DexProtoId
DexFieldId
DexMethodId
DexClassDef ClassDefs[]
DexData Data[] 数据
DexLink LinkData 链接
DexHeader
u1 magic[8] u几就是表明占位几个字节 版本信息
u4 checkSum 文件的校验值 alder 32字节
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文件格式相互之间的联系
imageDex文件结构体
详细链接安卓源码