ELF文件

概述

  • ELF(Executable and Linkable Format,可执行可链接格式),比如
    • 可执行文件
    • 对象文件
    • 共享库
  • ELF文件的组成部分
    • 可执行头部(Executable Header,Ehdr)
    • 程序头部(Program Header,Phdr)
    • 分区(Section)
    • 分区头部(Section Header,Shdr)

可执行头部

  • 位于/usr/include/elf.h,比如64位ELF文件,对应于Elf64_Ehdr
  • 魔法数字、文件信息 –> e_ident[16]
    • 魔法数字,用于识别ELF文件
      • 0x7f、E、L、F –> ASCII码
    • ELF文件信息
      • EI_CLASS(32位/64位) –> ELFCLASS32(1)、ELFCLASS64(2)
      • EI_DATA(小端/大端) –> ELFDATA2LSB(1)、ELFDATA2MSB(2)
      • EI_VERSION(ELF规范的版本) –> 1
      • EI_OSABI(UNIX System V ABI) –> 0
      • EI_ABIVERSION(OSABI的版本) –> 0
    • 填充
      • EI_PAD –> 保留为0
    • 两种接口
      • 应用程序接口(Application Program Interface,API) –> 应用程序和应用程序之间的接口
      • 应用二进制接口(Application Binary Interface,ABI) –> 应用程序和操作系统之间的接口
  • 更多信息 –> e_type、e_machine、e_version、e_entry、e_flags
    • e_type –> ELF文件类型,比如
      • ET_EXEC –> 可执行文件
      • ET_REL –> 可重定位的对象文件
      • ET_DYN –> 可动态链接的共享库
    • e_machine –> 机器,比如
      • EM_X86_64 –> 64位X86
      • EM_ARM –> ARM
    • e_version –> ELF规范的版本
      • 和EI_VERSION一样 –> 1
    • e_entry –> 入口点
      • 当解释器完成加载后,跳转到入口点
    • e_flags –> 机器相关的标志
      • X86为0,其他机器(比如嵌入式ARM)可能会设置标志
  • 分区和分段 –> e_shoff、e_phoff
    • ELF文件的两种视角
      • 分区(Section) –> 链接时使用,静态程序
      • 分段(Segment) –> 运行时使用,动态进程

分区头部和分区

程序头部