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里面的部分内容,以后应该会逐渐扩展 源码