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 

整体格式概要

image

DexFile整体文件结构

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

文件格式相互之间的联系

image

Dex文件结构体
详细链接安卓源码

上一篇下一篇

猜你喜欢

热点阅读