ELF 格式详解(一)

ELF 全称 “Executable and Linkable Format”,即可执行可链接文件格式,目前常见的Linux、 Android可执行文件、共享库(.so)、目标文件( .o)以及Core 文件(吐核)均为此格式。

文件布局

常见的ELF文件大致结构如下:

常见的ELF格式如上图所示,左边为链接视图,右边为执行视图。

链接视图:

静态链接器(即编译后参与生成最终ELF过程的链接器,如ld )会以链接视图解析ELF。编译时生成的 .o(目标文件)以及链接后的 .so (共享库)均可通过链接视图解析,链接视图可以没有段表(如目标文件不会有段表)。

执行视图:

动态链接器(即加载器,如x86架构 linux下的 /lib/ld-linux.so.2或者安卓系统下的 /system/linker均为动态链接器)会以执行视图解析ELF并动态链接,执行视图可以没有节表。

文件头

ELF的结构声明位于系统头文件 elf.h 中,ELF格式分为32位与64位两种,除了重定位类型稍有区别,其它大致相同,为了简化描述,后续说明将省略32/64字样。

ELF Header的声明如下 :

#define EI_NIDENT (16)
typedef struct
{
    unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
    Elf_Half		e_type;			/* Object file type */
    Elf_Half		e_machine;		/* Architecture */
    Elf_Word	        e_version;		/* Object file version */
    Elf_Addr		e_entry;		/* Entry point virtual address */
    Elf_Off		e_phoff;		/* Program header table file offset */
    Elf_Off		e_shoff;		/* Section header table file offset */
    Elf_Word	        e_flags;		/* Processor-specific flags */
    Elf_Half		e_ehsize;		/* ELF header size in bytes */
    Elf_Half		e_phentsize;		/* Program header table entry size */
    Elf_Half		e_phnum;		/* Program header table entry count */
    Elf_Half		e_shentsize;		/* Section header table entry size */
    Elf_Half		e_shnum;		/* Section header table entry count */
    Elf_Half		e_shstrndx;		/* Section header string table index */
} Elf_Ehdr;

e_ident

包含了Maigc Number和其它信息,共16字节。	
0~3:前4字节为Magic Number,固定为ELFMAG。
4(EI_CLASS):ELFCLASS32代表是32位ELF,ELFCLASS64 代表64位ELF。
5(EI_DATA):ELFDATA2LSB代表小端,ELFDATA2MSB代表大端。
6(EI_VERSION):固定为EV_CURRENT(1)。
7(EI_OSABI):操作系统ABI标识(实际未使用)。
8(EI_ABIVERSION):ABI版本(实际 未使用)。
9~15:对齐填充,无实际意义。

e_type

ELF的文件类型,定义如下:
ET_REL		可重定位文 件(如目标文件)
ET_EXEC	        可执行文件(可直接执行的文件)
DT_DYN	        共享目标文件(如SO库)
DT_CORE	        Core文件(吐核文件)
注:GCC使用编译选项 -pie 编译的可执行文件实际 也是DT_DYN类型。

e_machine

处理器架构类型,常见的定义如下:
EM_386		Intel 386架构(实际上就是32位的x86架构)
EM_X86_64	Amd x86-64架构
EM_ARM		ARM架构(包括thumb,thumb2)
EM_AARCH64	ARM64架构

e_verison

                  文件版本,目前常见的ELF 文件版本均为EV_CURRENT(1)。

e_entry

                  入口虚拟地址。

e_phoff

                  段表文件偏移。

e_shoff

                  节表文件偏移。

e_flags

                  处理器特定的标志,一般为0。

e_ehsize

                  Elf_Header的大小(字节)

e_phentsize

                  段头(Program Header)的大小(字节)。

e_phnum

                  段的数量。

e_shentsize

                  节头(Section Header)的大小(字节)。

e_shnum

                  字的数量。

e_shstrndx

                 节字符串表的节索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值