最开始有在树莓派中看见ELF文件,故在此进行记录
Executable and Linkable Format
可执行链接格式(ELF
),是Unix
系统实验室(USL
)作为应用程序二进制接口而开发和发布的。
ELF
目标文件有三种类型:
可重定位文件:保存代码和适当的数据,用来和其他object
文件一起创建一个可执行文件或共享文件
可执行文件:保存一个用来执行的程序,该文件指出了如何来创建程序进程映像
共享目标文件:包含了在两种使用环境中链接的代码和数据。
ld
)可以将它和其余可重定位文件和共享目标文件一起处理,生成另外一个目标文件三种类型的ELF
文件结构都是相同的
主要由四部分组成:
ELF header
Program header table
Sections
Section header table
ELF header
#define EI_NIDENT 16 typedef struct{ unsigned char e_ident[EI_NIDENT]; //占用16个字节 Elf32_Half e_type; //Elf32_Half表示是2个字节大小,代表文件的类型 Elf32_Half e_machine; //代表运行该程序需要的体系结构 Elf32_Word e_version; //Elf32_Word表示4个字节大小,代表文件版本 Elf32_Addr e_entry; //Elf32_Addr表示4个字节大小,代表程序的入口地址 Elf32_Off e_phoff; //Elf32_Off表示4个字节大小,是`Program header table`在文件中的偏移量 Elf32_Off e_shoff; //是`Section header table`在文件中的偏移量 Elf32_Word e_flags; //保存着相关文件的特定处理器信息 Elf32_Half e_ehsize; //表示`ELF header`的大小 Elf32_Half e_phentsize; //表示`Program header table`中每一个条目的大小 Elf32_Half e_phnum; //表示`program header table`中有多少个条目 Elf32_Half e_shentsize; //表示`Section header table`中每一个条目的大小 Elf32_Half e_shnum; //表示`Section header table`中有多少个条目 Elf32_Half e_shstrndx; //保存着字符表相关入口的节区头部表索引 }Elf32_Ehdr;
Section header table
typedef struct{ Elf32_Word sh_name; //节区名,是节区头部字符串表节区(Section Header String Table Section)的索引。名字是一个 NULL 结尾的字符串。 Elf32_Word sh_type; //为节区类型 Elf32_Word sh_flags; //节区标志 Elf32_Addr sh_addr; //如果节区将出现在进程的内存映像中,此成员给出节区的第一个字节应处的位置。否则,此字段为 0。 Elf32_Off sh_offset; //此成员的取值给出节区的第一个字节与文件头之间的偏移。 Elf32_Word sh_size; //此 成 员 给 出 节 区 的 长 度 ( 字 节 数 )。 Elf32_Word sh_link; //此成员给出节区头部表索引链接。其具体的解释依赖于节区类型。 Elf32_Word sh_info; //此成员给出附加信息,其解释依赖于节区类型。 Elf32_Word sh_addralign; //某些节区带有地址对齐约束. Elf32_Word sh_entsize; //某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。 }Elf32_Shdr;
Program header table
typedef struct { Elf32_Word p_type; //此数组元素描述的段的类型,或者如何解释此数组元素的信息。 Elf32_Off p_offset; //此成员给出从文件头到该段第一个字节的偏移 Elf32_Addr p_vaddr; //此成员给出段的第一个字节将被放到内存中的虚拟地址 Elf32_Addr p_paddr; //此成员仅用于与物理地址相关的系统中。System V忽略所有应用程序的物理地址信息。 Elf32_Word p_filesz; //此成员给出段在文件映像中所占的字节数。可以为0。 Elf32_Word p_memsz; //此成员给出段在内存映像中占用的字节数。可以为0。 Elf32_Word p_flags; //此成员给出与段相关的标志。 Elf32_Word p_align; //此成员给出段在文件中和内存中如何对齐。 } Elf32_phdr;
这个也只是简单的介绍了一下ELF
文件,并没有对该文件进行具体的分析 我好菜
如果需要更细致的分析,请点击参考链接
ELF文件格式解析
知乎专栏