欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elf格式二进制文件

程序员文章站 2022-07-15 22:05:34
...

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数组功能

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的幂次数。