ELF文件头更详细结构

来源:互联网 发布:mac自带快捷键怎么设置 编辑:程序博客网 时间:2024/05/17 03:54

ELF文件头结构定义在“/usr/include/elf.h”头文件下,ELF文件有32位版本和64位版本,故其头文件结构也有32位结构和64位结构,分别定义为Elf32_Ehdr和Elf64_Ehdr。两种版本文件内容一样,只是有些成员的大小不一样。以下是32位版本的文件头结构Elf32_Ehdr。

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;   //表示Program header table 在文件中的偏移量
  Elf32_Off e_shoff;   //表示Section header table 在文件中的偏移量
  Elf32_Word e_flags;   // 对IA32而言,此项为0。
  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;


readelf -h libelf.o 可得如下输出:

  ELF 头:

  1. Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  2. 类别: ELF32
  3. 数据:     2 补码,小端序 (little endian)
  4. 版本:1 (current)
  5.  OS/ABI: UNIX - System V
  6. .版本:0
  7. 类型: DYN (Share object file)
  8. 系统架构: ARM
  9. 版本:0x1
  10. 入口点地址:0x0
  11. 段头起点:52 (bytesintofile)
  12. 头起点:12616 (bytesintofile)
  13. 标志:0x5000000 ,Version5 EABI
  14. 本头的大小:52 (字节)
  15. 段头大小(每条):32(字节)
  16. 段头数量: 8
  17. 节头大小(每条)40(字节)
  18. 节头数量:22
  19. 字符串表索引节头:21





魔数: 
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
7f 、45、4c、46分别对应ascii码的Del(删除)、字母E、字母L、字母F。这四个字节被称为ELF文件的魔数,操作系统在加载可执行文件时会确认魔数是否正确,如果不正确则拒绝加载。 
第五个字节标识ELF文件是32位(01)还是64位(02)的。 
第六个字节标识该ELF文件字节序是小端(01)还是大端(02)的。 
第七个字节指示ELF文件的版本号,一般是01。 
后九个字节ELF标准未做定义。一般为00.

文件类型: 

e_type成员标识文件类型,ELF文件有三种类型,如下表所示。

常量标识值类型ET_REL1可重定位文件,一般位.o文件ET_EXEC2可执行文件ET_DYN3共享目标文件,一般位.so文件

系统架构: 

  系统架构: Intel 80386、ARM等。


  


原创粉丝点击