一 文件组成
ELF文件由4部分组成,分别是ELF头,程序头表(ELF header) ,程序头表(Programme header table) ,节(Sections) ,和节头表(Sections) 。实际上一个文件中并不一定含有上述全部的内容,实际上只有ELF头文件的位置是固定的,其余各个部分的位置,大小等信息由ELF的各项值来决定。
2文件头
文件头共 52字节,描述了字的大小,生成该文件的系统的字节顺序,ELF头的大小,目标文件类型、机器类型等。
ELF Header结构体定义:
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
最开头是16字节的e_ident,其中用以表示ELF文件的字符,以及其他一些与机器无关的信息。
开头的4字节是固定不变的,第一个字节值是0x7F,紧接着就是ELF三个字符,这四个字节表明这个文件是ELF文件。
Elf32_Half e_type;
表示文件的类型, 值为2 表示为一个可执行文件。
Elf32_Half e_machine;
表示程序运行机器的体系结构
Elf32_Word e_version;
用以确定文件的版本
Elf32_Addr e_entry;
程序的入口地址
Elf32_Off e_phoff;
Programme header table 在文件中的偏移量(以字节计数),
Elf32_Off e_shoff;
Section Header table 在文件中的偏移量,(以字节计数)
Elf32_Word e_flags;
对IA32来说,此项为0
Elf32_Half e_ehsize;
ELF header 的大小(以字节计数)
Elf32_Half e_phentsize;
Programme header table 中的每一个条目(一个programme header)的大小,这里值为5 ,
Elf32_Half e_phnum;
Programme header table 有多少个条目
Elf32_Half e_shentsize;
Section header table 中的每一个条目的大小
Elf32_Half e_shnum;
Section header table 有多少个条目。
Elf32_Half e_shstrndx;
包含节名称的字符串表是第几个字节(从0开始数)。
} 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 无符号小整数
3 Programme Header
实际上Programmer header 描述的是系统准备程序运行所需的一个段(Segment),或其他的信息。
结构体定义:
typedef struct {
Elf32_Word p_type 当前Programmer header 所描述的段的类型。
Elf32_Off p_offset 段的第一个字节在文件中的偏移。
Elf32_Addr p_vaddr 段的第一个字节在内存中的虚拟地址。
Elf32_Addr p_paddr 在物理地址定位相关的系统中,此项为物理地址保留。
Elf32_Word p_filesz 段在文件中的长度。
Elf32_Word p_memsz 段在内存中的长度。
Elf32_Word p_flags 与段相关的标志
Elf32_Word p_align 根据此项值来确定段在文件中以及内存中如何对齐
综述 ,该字段描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小,如果我们想把一个文件加载进内存的话,需要的就是这些数据。
}