可执行链接格式 ( Executable and Linking Format)最初是由 UNIX 系统实验室 ( UNIXSystem Laboratories, USL)开发并发布, 作为应用程序二进制接口 ( Application BinaryInterface, ABI)的一部分,它是一种常用的目标文件格式,主要包含以下三种类型
1、可重定位文件:可与其它目标文件一起创建可执行文件和共享目标文件
2、可执行文件:可执行的一个程序,此文件规定了exec() 如何创建一个程序的进程映像。
3、共享目标文件:链接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
ELF常用数据格式
所有数据结构都遵从“自然”大小和对齐规则。
目标文件格式
目标文件既要参与程序链接,又要参与程序执行,因此提供两种并行视图,分别反应不同活动需求。
ELF头部:描述整个文件组织。
程序头部:告诉系统如何创建进程映像。
节区头部:每个节区在表中都有一项,每一项给出节区名称、大小等信息。用于链接的目标文件必含节区头部表。
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];//ElF标识信息,16个字节
Elf32_Half e_type;//目标文件类型,2个字节
Elf32_Half e_machine;//目标体系结构类型,2个字节
Elf32_Word e_version;//目标文件版本,4个字节
Elf32_Addr e_entry;//程序入口的虚拟地址,如果没有则为0,4个字节
Elf32_Off e_phoff;//程序头部表偏移,4个字节
Elf32_Off e_shoff;//节区头部表偏移,4个字节
Elf32_Word e_flags;//与文件相关,特定于处理器标志,4个字节
Elf32_Half e_ehsize;//elf头部大小,2个字节
Elf32_Half e_phentsize;//程序头部表格的表项大小,2个字节
Elf32_Half e_phnum;//程序头部表格表项数目,2个字节
Elf32_Half e_shentsize;//节区头部表格的表项大小,2个字节
Elf32_Half e_shnum;//节区头部表格的表项数目,2个字节
Elf32_Half e_shstrndx;//节区头部表格中与节区名称字符串表相关的表项索引,2个字节
}Elf32_Ehdr;
typedef struct {
Elf32_Word p_type;//描述段的类型,4个字节
Elf32_Off p_offset;//段偏移,4个字节
Elf32_Addr p_vaddr;//段虚拟地址,4个字节
Elf32_Addr p_paddr;//物理地址,4个字节
Elf32_Word p_filesz;//段的文件映像大小,4个字节
Elf32_Word p_memsz;//段的内存映像大小,4个字节
Elf32_Word p_flags;//段相关标识,4个字节
Elf32_Word p_align;//对齐取值,4个字节
} Elf32_phdr;
typedef struct{
Elf32_Word sh_name;//节区名称,是字符串表节区索引,4个字节
Elf32_Word sh_type;//节区类型,4个字节
Elf32_Word sh_flags;//节区标志,4个字节
Elf32_Addr sh_addr;//节区内存地址,4个字节
Elf32_Off sh_offset;//节区偏移,4个字节
Elf32_Word sh_size;//节区长度,4个字节
Elf32_Word sh_link;//节区头部表索引链接,4个字节
Elf32_Word sh_info;//附加信息,4个字节
Elf32_Word sh_addralign;//对齐约束,4个字节
Elf32_Word sh_entsize;//节区表项大小,4个字节
}Elf32_Shdr;
typedef struct {
Elf32_Word st_name;//符号表项名称,是字符串表索引,4个字节
Elf32_Addr st_value;//符号值,4个字节
Elf32_Word st_size;//符号大小,4个字节
unsigned char st_info;//类型和绑定信息,1个字节
unsigned char st_other;//无定义,1个字节,当前值为0
Elf32_Half st_shndx;//节区头部索引,2个字节
} Elf32_sym;
节区包含目标文件中所有信息。除了ELF头部、程序头部表格、节区头部表格。节区满足以下条件:
1、每个节区都有对应的节区头部描述,而有节区头部却不一定有节区。
2、每个节区占用连续字节区域,可能为0
3、目标文件中可能包含非活动空间,这些区域不属于任何头部和节区,其内容未指定。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193384.html原文链接:https://javaforall.cn