ELF文件格式

点点圈 提交于 2019-12-20 19:32:46

ELF头

Object目标文件类型

  • 一个可重定位(relocation)文件保存着代码和适当的数据,用来和其他的object文件一起创建一个可执行文件或一个共享文件。
  • 一个可执行(executable)文件保存着一个用来执行的程序,该文件指出exec(BA_OS)如何创建程序进程映像。
  • 一个共享object文件保存着代码和合适的数据,用来被链接器链接。第一个链接器[ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object;第二个动态链接器,联合一个可执行文件和其他共享object文件来创建一个进程映像。

Object文件格式

在这里插入图片描述

数据表示

在这里插入图片描述

ELF Header结构体

#define EI_NIDENT 16
typedef struct{
	unsigned char e_ident[EI_NIDENT];
	Elf32_Half e_type;
	Elf32_half e_machine;
	Elf32_Word e_version;//目标文件的版本,若为0,则是无效的版本,若>=1,则指示当前版本号
	Elf_Addr e_entry;//目标文件的入口地址
	Elf_Off e_phoff;//程序头表在文件的偏移量(以字节计数),若没有程序头表,则为0
	Elf_Off e_shoff;//section头表在文件的偏移量(以字节计数),若没有section头表,则为0
	Elf32_Word e_flags;//保存相关文件的特定处理器标志,来自EF_<machine>_<flag>
	Elf32_Half e_ehsize;//指示ELF头的大小
	Elf32_Half e_phentsize;//程序头表成员大小
	Elf32_Half e_phnum;//程序头表的成员个数
	Elf32_Half e_shentsize;//section头表成员大小
	Elf32_Half shnum;//section头表的成员数量
	Elf32_Half e_shstrndx;//section表名字符串索引,若文件没有section名字符串,则该变量为SHN_UNDEF
}Elf32_Ehdr;

e_ident

e_indent[]数组解析目标文件的内容

Name Index Purpose
EI_MAG0 0 File identification
EI_MAG1 1 File identification
EI_MAG2 2 File identification
EI_MAG3 3 File identification
EI_CLASS 4 File class
EI_DATA 5 Data encoding
EI_VERSION 6 File version
EI_PAD 7 Start of padding bytes
EI_NIDENT 16 Size of e_ident[]

1、EI_MAG0~EI_MAG3:保存着一个魔术数,用来确定该文件是否weiELF目标文件
在这里插入图片描述
2、EI_CLASS:确定文件的类型
在这里插入图片描述
3、EI_DATA:指示该文件的数据编码方式

Name Value Meaning
ELFDATANONE 0 无效数据编码格式
ELFDATA2LSB 1 大端编程格式
ELFDATA2MSB 2 小端编程格式

e_type类型

确定目标文件的类型

Name Value Meaning
ET_NONE 0 No file type
ET_REL 1 Relocatable file
ET_EXEC 2 Executable file
ET_DYN 3 Shared object file
ET_CORD 4 Core file
ET_LOPROC 0xff00 Processor-specific
ET_HIPROC 0xffff Processor-specific

e_machine

指出运行该程序需要的体系结构

Name Value Meaning
EM_NONE 0 No machine
EM_M32 1 AT&T WE 32100
EM_SPARC 2 SPARC
EM_386 3 Intel 80386
EM_68K 4 Motorola 68000
EM_88K 5 Motorola 88000
EM_860 7 Intel 80860
EM_MIPS 8 MIPS RS3000

ELF节

section头表结构体

一个section对应一个section节头数据结构体

typedef struct
{
	Elf32_Word	sh_name;		/* Section name (string tbl index) */
 	Elf32_Word	sh_type;		/* Section type */
 	Elf32_Word	sh_flags;		/* Section flags */
 	Elf32_Addr	sh_addr;		/* Section virtual addr at execution */
 	Elf32_Off	sh_offset;		/* Section file offset */
 	Elf32_Word	sh_size;		/* Section size in bytes */
 	Elf32_Word	sh_link;		/* Link to another section */
 	Elf32_Word	sh_info;		/* Additional section information */
 	Elf32_Word	sh_addralign;	/* Section alignment */
 	Elf32_Word	sh_entsize;		/* Entry size if section holds table */
} Elf32_Shdr;

section介绍

节名称 类型 属性 说明
.bss SHT_NOBITS SHF_ALLOC + SHF_WRITE 保存未初始化的数据,当程序开始运行时,系统初始化该section数据为0
.comment SHT_PROGBITS none 保存版本控制信息
.data SHT_PROGBITS SHF_ALLOC + SHF_WRITE 保存初始化的数据
.debug SHT_PROGBITS none 保存标号调试信息
.dynamic SHT_DYNAMIC SHF_ALLOC [+ SHF_WRITE] 保存动态链接的信息
.dynstr SHT_STRTAB SHF_ALLOC 保存动态链接时需要的字符串,一般情况下,名字字符串关联着符号表的入口
.dynsym SHT_DYNSYM SHF_ALLOC 保存着动态符号
.fini SHT_PROGBITS SHF_ALLOC + SHF_EXECINSTR 进程的终止代码
.got SHT_PROGBITS 全局偏移量表
.hash SHT_HASH SHF_ALLOC 标号的哈希表
.init SHT_PROGBITS SHF_ALLOC + SHF_EXECINSTR 进程的初始化代码
.interp SHT_PROGBITS 程序的解释程序的路径
.line SHT_PROGBITS none 编辑字符的行数信息
.note SHT_NOTE none
.plt SHT_PROGBITS 过程链接表
.rel SHT_REL 重定位信息表
.rela SHT_RELA 重定位信息表
.rodata SHT_PROGBITS SHF_ALLOC 只读数据
.shstrtab SHT_STRTAB none section名称字符串表
…strtab SHT_STRTAB 字符串表
.symtab SHT_SYMTAB 符号表
.text SHT_PROGBITS HF_ALLOC + SHF_EXECINSTR 可执行指令

符号表

/* Symbol table entry.  */
typedef struct
{
	Elf32_Word	st_name;		/* Symbol name (string tbl index) */
	Elf32_Addr	st_value;		/* Symbol value */
	Elf32_Word	st_size;		/* Symbol size */
	unsigned char	st_info;	/* Symbol type and binding */
	unsigned char	st_other;	/* Symbol visibility */
	Elf32_Section	st_shndx;		/* Section index */
} Elf32_Sym;

字符串表

符号值

重定位

/* Relocation table entry without addend (in section of type SHT_REL).  */
typedef struct
{
	Elf32_Addr	r_offset;		/* Address */
	Elf32_Word	r_info;		/* Relocation type and symbol index */
} Elf32_Rel;
/* Relocation table entry with addend (in section of type SHT_RELA).  */
typedef struct
{
	Elf32_Addr	r_offset;		/* Address */
	Elf32_Word	r_info;		/* Relocation type and symbol index */
	Elf32_Sword	r_addend;		/* Addend */
} Elf32_Rela;

重定位类型

Linux命令行

1、file命令查看相应的文件格式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!