UNIX/Linux 平台可执行文件格式分析(5)

  ELF文件格式分析

  ELF 文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o。共享文件:也就是通常称的库文件,后缀为.so。可执行文件:本文主要讨论的文件格式,总的来说,可执行文件的格式与上述两种文件的格式之间的区别主要在于观察的角度不同:一种称为连接视图(Linking View),一种称为执行视图(Execution View)。

  首先看看ELF文件的总体布局:

  ELF header(ELF头部)
  Program header table(程序头表)
  Segment1(段1)
  Segment2(段2)
  ………
  Sengmentn(段n)
  Setion header table(节头表,可选)

  段由若干个节(Section)构成,节头表对每一个节的信息有相关描述。对可执行程序而言,节头表是可选的。参考资料 1中作者谈到把节头表的所有数据全部设置为0,程序也能正确运行!ELF头部是一个关于本文件的路线图(road map),从总体上描述文件的结构。下面是ELF头部的数据结构:

  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; /* ELF头部长度 */
  Elf32_Half e_phentsize; /* 程序头部中一个条目的长度 */
  Elf32_Half e_phnum; /* 程序头部条目个数 */
  Elf32_Half e_shentsize; /* 节头部中一个条目的长度 */
  Elf32_Half e_shnum; /* 节头部条目个数 */
  Elf32_Half e_shstrndx; /* 节头部字符表索引 */
  } Elf32_Ehdr;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/28562.html