ELF文件

Published: by Creative Commons Licence

ELF文件格式

ELF

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;
	Elf32_Addr e_entry;
	Elf32_Off e_phoff;
	Elf32_Off e_shoff;
	Elf32_Word e_flags;
	Elf32_Half e_ehsize;
	Elf32_Half e_phentsize;
	Elf32_Half e_phnum;
	Elf32_Half e_shentsize;
	Elf32_Half e_shnum;
	Elf32_Half e_shstrndx;
} Elf32_Ehdr;
  • e_ident  表明是ELF文件,提供文件类型,编码格式

    index 描述
    0,1,2,3 0x7f,'E','L','F',标识这是一个ELF文件,magic number
    4 表示文件的类型,0无效,1表示32位ELF文件,2表示64位ELF文件
    5 表示文件的编码格式,0无效,1表示小端字节序1,2表示大端字节序2
    6 表示ELF版本信息,0无效,1当前版本,所以必须为1
    8~15 暂时不用,置0
  • e_type  表明ELF文件的类型

    Name value Meaning
    ET_NONE 0 无效文件类型
    ET_REL 1 可重定位文件
    ET_EXEC 2 可执行文件
    ET_DYN 3 动态共享文件
    ET_CORE 4 崩溃转储文件
    ET_LOPROC 0xff00 处理器相关文件下边界
    ET_HIPROC 0xffff 处理器相关文件上边界3
  • e_machine  表示ELF文件运行需要的硬件结构

    Name value Meaning
    ET_NONE 0 无效
    EM_M32 1 AT&T WE 32100
    EM_SPARC 2 SPARC
    EM_386 3 Intel Architecture
    EM_68k 4 Motorola 68000
    EM_88k 5 Motorola 88000
    EM_860 7 Intel 80860
    EM_MIPS 8 MIPS RS3000 Big-Endian
    EM_MIPS_RS4_BE 10 MIPS RS4000 Big-Endian
    RESERVED 11-16 Reserved for future use
  • e_version  表示ELF版本号,0表示无效版本号,1表示当前版本号,其余的表示扩展版本,有需要时设置

  • e_entry  程序开始运行时的入口虚拟地址

  • e_phoff  程序头表在文件中的偏移字节数

  • e_shoff  节头表在文件中的偏移字节数

  • e_flags  指名与处理器相关的标志,命名方式为:EF__machine_flag

  • e_ehsize  ELF Header的字节大小

  • e_phentsize  程序头表中每个条目的字节大小

  • e_phnum  程序头表中条目的个数

  • e_shentsize  节头表中每个条目的字节大小

  • e_shnum  节头表中条目的个数

  • e_shstrndx  指明string table在节头表中的位置

Program Header

程序头表是一个结构体数组,每一个结构体描述一个segment或其他系统运行程序需要的信息

typedef struct {
	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;
} Elf32_Phdr;
  • p_type  指明描述的segment的类型

    Name value Meaning
    PT_NULL 0 忽略
    PT_LOAD 1 可加载程序段
    PT_DYNAMIC 2 动态链接信息
    PT_INTERP 3 动态加载器名称
    PT_NOTE 4 附加信息
    PT_SHLIB 5 保留
    PT_PHDR 6 程序头表,既此处描述的就是程序头表自己
    PT_LOPROC 0x70000000 处理器预留
    PT_HIPROC 0x7fffffff 处理器预留
  • p_offset  segment在文件中的偏移字节数

  • p_vaddr  segment在内存中的起始虚拟地址

  • p_paddr  仅用于与物理地址相关的系统中

  • p_filesz  segment在文件中的大小

  • p_memsz  segment在内存中的大小

  • p_flags  segment相关的标志

    Name value Meaning
    PF_X 1 可执行
    PF_W 2 可写
    PF_R 4 可读
    PF_MASKOS 3 操作系统相关
    PF_MASKPROC 4 处理器相关
  • p_align  在文件和内存中的对齐方式。如果为0或为1表示不对齐,否则应为2的幂次数

Section Header Table

包含着section的信息,链接过程中会使用到section,可执行文件中包含的是segment(一个或多个section合并而成)

typedef struct {
	Elf32_Word sh_name;
	Elf32_Word sh_type;
	Elf32_Word sh_flags;
	Elf32_Addr sh_addr;
	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;
  • sh_name  section名字索引,是一个整数下标,表示section名字在string table里面的位置

  • sh_type  表示section的种类

    Name value Meaning
    SHT_NULL 0 无效
    SHT_PROGBITS 1 程序自定义的信息
    SHT_SYMTAB 2 符号表
    SHT_STRTAB 3 字符串表
    SHT_RELA 4 重定位条目(带有明确的附加物)
    SHT_HASH 5 符号哈希表
    SHT_DYNAMIC 6 动态链接的信息
    SHT_NOTE 7 标记文件的信息(不确定意义)
    SHT_NOBITS 8 一般不占用空间,否则类似于SHT_PROGBITS
    SHT_REL 9 重定位条目(不带有明确的附加物)
    SHT_SHLIB 10 保留
    SHT_DYNSYM 11 符号表
    SHT_LOPROC 0x70000000 保留给处理器
    SHT_HIPROC 0x7fffffff 保留给处理器3
    SHT_LOUSER 0x80000000 保留给程序自定义的下边界
    SHT_HIUSER 0xffffffff 保留给程序自定义的上边界
  • sh_flags  描述section的属性

    Name value Meaning
    SHF_WRITE 1 section内含有执行期间可写数据
    SHF_ALLOC 2 section在执行期间会驻留在内存中
    SHF_EXECINSTR 4 section内含有可执行命令
    SHF_MASKPROC 0xf0000000 保留
  • sh_addr  section的起始内存地址

  • sh_offset  section在文件中的偏移地址

  • sh_size  section在文件中的字节大小

  • sh_link  一个节头表索引,具体含义与sh_type有关

    sh_type sh_link
    SHT_DYNAMIC string table的索引
    SHT_HASH 符号表的索引
    SHT_REL 相关符号表的索引
    SHT_RELA 相关符号表的索引
    SHT_SYMTAB 操作系统自定义
    SHT_DYNSYM 操作系统自定义
  • sh_info  额外信息,与type有关

  • sh_addralign  对齐字节数,0或1表示不对齐,否则必须取值为2的幂次数

  • sh_entsize  有的section包含一个表,这个值表示表中条目的大小

FINAL

写了一个分析elf文件部分格式的小程序,只能分析32位elf文件,主要分析了elf header,列出了phdr,shdr里面的部分内容,以后应该会逐渐扩展 源码

   ELF

  1. 小端字节序 

  2. 大端字节序 

  3. TIS中对此描述是:Values in this inclusive range are reserved for processor-specific semantics,所以这两个值内的范围是留给处理器自定义的  2