elf格式二进制文件
ELF目标文件类型 | 描述 |
---|---|
待重定位文件(relocatable file) | 待重定位文件就是常说的目标文件,源于源文件编译后但为链接的半成品,它用于与 其他目标文件合并链,以构建出可执行二进制文件或动态链接库。 |
共享目标文件(shared object file) | 又称动态链接库文件,在可执行文件加载过程中被动态链接,成为程序的一部分。 |
可执行文件(executable file) | 经过编译、链接后的可以直接运行的文件 |
程序最重要的部分是段(segment)和节(section),段和节的信息用header来描述,程序头是program header,节头是section header,描述它们的数据结构就是程序头表(program header table)和节头表(section header table),用一个数据结构来描述程序头表和节头表的大小和位置,这个数据结构就是elf header,定义elf header 的数据结构如下:
struct Elf32_Ehdr{
unsigned char e_ident[16];
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_hsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
};
e_ident[0]=0x7f | 这4位是ELF文件固定的魔数 |
e_ident[1]=’E’ | |
e_ident[2]=’L’ | |
e_ident[3]=’F’ | |
e_ident[4] | 用来标识elf文件的类型 值为0表示文件是不可识别类型 值为1表示是32位elf格式的文件 值为2表示是64位elf格式的文件 |
e_ident[5] | 用来指示编码格式 值为0时表示非法编码格式 值为1表示小端字节序,即LSB 值为2表示大端字节序,即MSB |
e_ident[6] | ELF头的版本信息 值为0时表示非法版本 值为1表示当前版本 |
e_ident[7~15] | 保留不用,初始化为0 |
e_type用来指定elf目标文件的类型,常见取值如下表:
elf目标文件类型 | 取值 | 意义 |
---|---|---|
ET_NONE | 0 | 未知目标文件格式,忽略 |
ET_REL | 1 | 可重定位文件 |
ET_EXEC | 2 | 可执行文件 |
ET_DYN | 3 | 动态共享目标文件 |
ET_CORE | 4 | core文件,程序崩溃时内存映像的转存格式 |
ET_LOPROC | 0xff00 | 特定处理器的扩展下边界 |
ET_HIPROC | 0xffff | 特定处理器的扩展上边界 |
e_version占用4字节,用来表示版本信息
e_entry占用4字节,用来指明操作系统运行该程序时,将控制权转交到虚拟地址
e_phoff占用4字节,用来知名程序头表在文件内的字节偏移量
e_shoff占用4字节,用来指明节头表在文件内的字节偏移量
e_ehsize占用2字节,用来指明elf header的字节大小
e_phentsize占用2字节,用来指明程序头表中每个条目(entry)的字节大小
e_phnum占用2个字节,用来指明程序头表中条目的数量
e_shentzize占用2个字节,用来指明节头表中每个条目的字节大小
e_shnum占用2个字节,用来指明节头表中条目的数量
e_shstrndx占用两个字节,用来指明string name table在节头表中的索引index
用来描述程序头表的数据结构是Elf32_Phdr,定义如下
struct Elf32_Phdr{
Elf32_Word p_type;
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;
};
p_type用来指明该段的类型,如下表
类型 | 取值 | 说明 |
---|---|---|
PT_NULL | 0 | 忽略 |
PT_LOAD | 1 | 可加载程序段 |
PT_DYNAMIC | 2 | 动态链接信息 |
PT_INTERP | 3 | 动态加载器名称 |
PT_NOTE | 4 | 一些辅助的附加信息 |
PT_SHLIB | 5 | 保留 |
PTO_PHDR | 6 | 程序头表 |
PT_LOPROC | 0x70000000 | |
PT_HIPROC | 0x7fffffff |
p_offset占用4字节,用来指明本段在文件内的偏移地址
p_vaddr占用4字节,用来指明本段在内存中的起始虚拟地址
p_paddr占用4字节,用来指明物理地址
p_filesz占用4字节,用力啊指明本段在文件中的大小
p_memsz占用4字节,用来指明本段在内存中的大小
p_flags占用4字节,用来指明与本段相关的标志,范围如下:
类型 | 取值 | 说明 |
---|---|---|
PF_X | 1 | 本段具有可执行权限 |
PF_W | 2 | 本段具有可写权限 |
PF_R | 3 | 本段具有可读权限 |
PF_MASKOS | 0x0ff00000 | 本段与操作系统相关 |
PF_MASKPROC | 0xf00000 | 本段与处理器相关 |
p_align占用4字节,用来指明本段在文件内和内存中的对齐方式。为0或1时表示不对齐,否则p_align应该是2的幂次数。