ELF是类Unix类系统,当然也包括Android系统上的可执行文件格式(也包括.so和.o类文件)。可以理解为Android系统上的exe或者dll文件格式。理解ELF文件规范,是理解Android系统上进程加载、执行的前提。下面我们就来一步步了解这ELF到底是个啥玩意儿(以Arm 32 ELF格式为主)!当然,网上关于ELF的介绍已经非常多,最好的手册还是直接看ELF官方的手册,我这里只是对ELF的文件做个纲领性介绍,然后直奔主题,比如.GOT .PLT或者R_Arm_Jump_Slot,R_Arm_Relative之类的玩意儿。
还是以libc.so为例来介绍,先看通过arm-linux-androideabi-readelf生成的ELF文件,很长,我们先看一个片段:
我们挑几个有意思的字段内容来说明。
首先ELF Header:顾名思义,这是所有ELF文件都有的”头“。里面包含了ELF文件的”纲领性“信息,如”Machine“表示当前CPU架构,该例为arm,”Start of Sections“表示”区(Section)头”的偏移字节数等等。
而Section Headers则列出了所有包含在文件中的Section区信息列表。如.data表示数据区,.text表示代码区等等。下面用一张图来对ELF的文件格式有个总览:
左边是静态视图,而右边则是链接加载时的视图,都是同一个文件的两种状态。
/* ELF Header */
typedef struct elfhdr {
unsigned char e_ident[EI_NIDENT]; /* ELF Identification */
Elf32_Half e_type; /* object file type */
Elf32_Half e_machine; /* machine */
Elf32_Word e_version; /* object file version */
Elf32_Addr e_entry; /* virtual entry point */
Elf32_Off e_phoff; /* program header table offset */
Elf32_Off e_shoff; /* section header table offset */
Elf32_Word e_flags; /* processor-specific flags */
Elf32_Half e_ehsize; /* ELF header size */
Elf32_Half e_phent