在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。

本页面主要目录有关于ELF的:组成部分、ELFheader、Program header等介绍

中文名

可执行与可链接格式

外文名

Executable and Linkable Format

拼音

jing ling

术语类别

文件格式

开发者

Unix系统实验室

领域

计算机科学

常用扩展名

o,so,elf,prx

简介

是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。

1999年,被86open项目选为x86架构上的类Unix操作系统的二进制文件标准格式,用来取代COFF。因其可扩展性与灵活性,也可应用在其它处理器、计算机系统架构的操作系统上。

组成部分

ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。

ELF

ELFheader

格式代码如下

#define EI_NIDENT 16

typedef struct{

unsigned char e_ident[EI_NIDENT];

Elf32_Half e_type;

Elf32_Half e_machine;

Elf32_Word e_version;

Elf32_Addr e_entry;

Elf32_Off e_phoff;

Elf32_Off e_shoff;

Elf32_Word e_flags;

Elf32_Half e_ehsize;

Elf32_Half e_phentsize;

Elf32_Half e_phnum;

Elf32_Half e_shentsize;

Elf32_Half e_shnum;

Elf32_Half e_shstrndx;

}Elf32_Ehdr;

数据类型说明

名称

大小

对齐

用途

Elf32_Addr

4

4

无符号程序地址

Elf32_Half

2

2

无符号中等大小整数

Elf32_Off

4

4

无符号文件偏移

Elf32_Sword

4

4

有符号大整数

Elf32_Word

4

4

无符号大整数

unsigned char

1

1

无符号小整数

代码项含义

最开头是16个字节的e_ident, 其中包含用以表示ELF文件的字符,以及其他一些与机器无关的信息。开头的4个字节值固定不变,为0x7f和ELF三个字符。

e_type 它标识的是该文件的类型。

e_machine 表明运行该程序需要的体系结构。

e_version 表示文件的版本。

e_entry 程序的入口地址。

e_phoff 表示Program header table 在文件中的偏移量(以字节计数)。

e_shoff 表示Section header table 在文件中的偏移量(以字节计数)。

e_flags 对IA32而言,此项为0。

e_ehsize 表示ELF header大小(以字节计数)。

e_phentsize 表示Program header table中每一个条目的大小。

e_phnum 表示Program header table中有多少个条目。

e_shentsize表示Section header table中的每一个条目的大小。

e_shnum 表示Section header table中有多少个条目。

e_shstrndx 包含节名称的字符串是第几个节(从零开始计数)。

Program header

Program header描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小。

格式代码如下

typedef struct {

Elf32_Wordp_type;

Elf32_Offp_offset;

Elf32_Addr p_vaddr;

Elf32_Addr p_paddr;

Elf32_Wordp_filesz;

Elf32_Word p_memsz;

Elf32_Word p_flags;

Elf32_Word p_align;

}

代码项含义

p_type 当前Program header所描述的段的类型。

p_offset 段的第一个字节在文件中的偏移。

p_vaddr 段的一个字节在内存中的虚拟地址

p_paddr 在物理内存定位相关的系统中,此项是为物理地址保留。

p_filesz 段在文件中的长度。

p_memsz 段在内存中的长度。

p_flags 与段相关的标志。

p_align 根据此项值来确定段在文件及内存中如何对齐。