美文网首页
ELF文件结构

ELF文件结构

作者: 骑猪满天飞 | 来源:发表于2021-02-20 08:33 被阅读0次

ELF文件类型:

1. 待重定位文件 (relocatable file)
2. 共享目标文件 (shared object file)
3. 可执行文件 (executable file)

ELF文件分为文件头文件体两部分,文件头用来描述整个程序文件的组织结构,文件体则是真正的程序文件。

同时,ELF文件又将程序体分为不同的段(segment)节(section)。程序中有很多段,如代码段和数据段等,同样也有很多节,段是由节组成的,多个节经过链接之后就被合并成一个段。

ELF文件使用程序头表(program header table)来描述段信息,使用节头表(section header table)来描述节信息。由于段和节信息不是固定不变的,所以两表在文件中位置也不固定。因此,需要一个固定位置,固定大小的数据结构,来描述程序头表和节头表,这个数据就是ELF文件头。

ELF文件结构具体布局如下:

overview.png

ELF文件的相关定义可在linux系统/usr/include/elf.h找到

文件头结构

/* Type for a 16-bit quantity.  */
typedef uint16_t Elf32_Half;

/* Types for signed and unsigned 32-bit quantities.  */
typedef uint32_t Elf32_Word;

/* Type of addresses.  */
typedef uint32_t Elf32_Addr;

/* Type of file offsets.  */
typedef uint32_t Elf32_Off;

typedef struct
{
  unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
  Elf32_Half    e_type;         /* Object file type */
  Elf32_Half    e_machine;      /* Architecture */
  Elf32_Word    e_version;      /* Object file version */
  Elf32_Addr    e_entry;        /* Entry point virtual address */
  Elf32_Off e_phoff;        /* Program header table file offset */
  Elf32_Off e_shoff;        /* Section header table file offset */
  Elf32_Word    e_flags;        /* Processor-specific flags */
  Elf32_Half    e_ehsize;       /* ELF header size in bytes */
  Elf32_Half    e_phentsize;        /* Program header table entry size */
  Elf32_Half    e_phnum;        /* Program header table entry count */
  Elf32_Half    e_shentsize;        /* Section header table entry size */
  Elf32_Half    e_shnum;        /* Section header table entry count */
  Elf32_Half    e_shstrndx;     /* Section header string table index */
} 
  • e_ident[EI_NIDENT],16个字节
e_ident.png
  • e_type,2个字节,指定elf文件类型
type.png
  • e_machine, 2字节 , 表示在哪种硬件平台执行
e_machine.png
  • e_version, 4字节,表示版本信息

  • e_entry,4字节,指明操作系统运行该程序时,将控制权转交到的虚拟地址

  • e_phoff,4字节,指明程序头表在文件中的字节偏移量。0表示没有

  • e_shoff,4字节,指明节头标偏移,0表示没有

  • e_flags,4字节,表示处理器相关标志

  • e_ehsize,2字节,指明文件头大小

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

  • e_phnum,2字节,指明程序头表中条目数量,即段个数

  • e_shentsize,2字节,指明节头表中每个条目的大小

  • e_shnum,2字节,指明节头标中条目的数量,即节个数

  • e_shstrndx,用来指明string name table 在节头表中的索引index

程序头表结构(program header table)

typedef struct
{
  Elf32_Word    p_type;         /* Segment type */
  Elf32_Off     p_offset;       /* Segment file offset */
  Elf32_Addr    p_vaddr;        /* Segment virtual address */
  Elf32_Addr    p_paddr;        /* Segment physical address */
  Elf32_Word    p_filesz;       /* Segment size in file */
  Elf32_Word    p_memsz;        /* Segment size in memory */
  Elf32_Word    p_flags;        /* Segment flags */
  Elf32_Word    p_align;        /* Segment alignment */
} Elf32_Phdr;

p_type:

/* Legal values for p_type (segment type).  */

#define PT_NULL     0       /* Program header table entry unused */
#define PT_LOAD     1       /* Loadable program segment */
#define PT_DYNAMIC  2       /* Dynamic linking information */
#define PT_INTERP   3       /* Program interpreter */
#define PT_NOTE     4       /* Auxiliary information */
#define PT_SHLIB    5       /* Reserved */
#define PT_PHDR     6       /* Entry for header table itself */
#define PT_TLS      7       /* Thread-local storage segment */
#define PT_NUM      8       /* Number of defined types */
#define PT_LOOS     0x60000000  /* Start of OS-specific */
#define PT_GNU_EH_FRAME 0x6474e550  /* GCC .eh_frame_hdr segment */
#define PT_GNU_STACK    0x6474e551  /* Indicates stack executability */
#define PT_GNU_RELRO    0x6474e552  /* Read-only after relocation */
#define PT_LOSUNW   0x6ffffffa
#define PT_SUNWBSS  0x6ffffffa  /* Sun Specific segment */
#define PT_SUNWSTACK    0x6ffffffb  /* Stack segment */
#define PT_HISUNW   0x6fffffff
#define PT_HIOS     0x6fffffff  /* End of OS-specific */
#define PT_LOPROC   0x70000000  /* Start of processor-specific */
#define PT_HIPROC   0x7fffffff  /* End of processor-specific */

节头表(section header table)

typedef struct
{
  Elf32_Word    sh_name;        /* Section name (string tbl index) */
  Elf32_Word    sh_type;        /* Section type */
  Elf32_Word    sh_flags;       /* Section flags */
  Elf32_Addr    sh_addr;        /* Section virtual addr at execution */
  Elf32_Off     sh_offset;      /* Section file offset */
  Elf32_Word    sh_size;        /* Section size in bytes */
  Elf32_Word    sh_link;        /* Link to another section */
  Elf32_Word    sh_info;        /* Additional section information */
  Elf32_Word    sh_addralign;       /* Section alignment */
  Elf32_Word    sh_entsize;     /* Entry size if section holds table */
} Elf32_Shdr;

sh_type:

/* Legal values for sh_type (section type).  */

#define SHT_NULL      0     /* Section header table entry unused */
#define SHT_PROGBITS      1     /* Program data */
#define SHT_SYMTAB    2     /* Symbol table */
#define SHT_STRTAB    3     /* String table */
#define SHT_RELA      4     /* Relocation entries with addends */
#define SHT_HASH      5     /* Symbol hash table */
#define SHT_DYNAMIC   6     /* Dynamic linking information */
#define SHT_NOTE      7     /* Notes */
#define SHT_NOBITS    8     /* Program space with no data (bss) */
#define SHT_REL       9     /* Relocation entries, no addends */
#define SHT_SHLIB     10        /* Reserved */
#define SHT_DYNSYM    11        /* Dynamic linker symbol table */
#define SHT_INIT_ARRAY    14        /* Array of constructors */
#define SHT_FINI_ARRAY    15        /* Array of destructors */
#define SHT_PREINIT_ARRAY 16        /* Array of pre-constructors */
#define SHT_GROUP     17        /* Section group */
#define SHT_SYMTAB_SHNDX  18        /* Extended section indeces */
#define SHT_NUM       19        /* Number of defined types.  */
#define SHT_LOOS      0x60000000    /* Start OS-specific.  */
#define SHT_GNU_ATTRIBUTES 0x6ffffff5   /* Object attributes.  */
#define SHT_GNU_HASH      0x6ffffff6    /* GNU-style hash table.  */
#define SHT_GNU_LIBLIST   0x6ffffff7    /* Prelink library list */
#define SHT_CHECKSUM      0x6ffffff8    /* Checksum for DSO content.  */
#define SHT_LOSUNW    0x6ffffffa    /* Sun-specific low bound.  */
#define SHT_SUNW_move     0x6ffffffa
#define SHT_SUNW_COMDAT   0x6ffffffb
#define SHT_SUNW_syminfo  0x6ffffffc
#define SHT_GNU_verdef    0x6ffffffd    /* Version definition section.  */
#define SHT_GNU_verneed   0x6ffffffe    /* Version needs section.  */
#define SHT_GNU_versym    0x6fffffff    /* Version symbol table.  */
#define SHT_HISUNW    0x6fffffff    /* Sun-specific high bound.  */
#define SHT_HIOS      0x6fffffff    /* End OS-specific type */
#define SHT_LOPROC    0x70000000    /* Start of processor-specific */
#define SHT_HIPROC    0x7fffffff    /* End of processor-specific */
#define SHT_LOUSER    0x80000000    /* Start of application-specific */
#define SHT_HIUSER    0x8fffffff    /* End of application-specific */

相关文章

  • 第13课 elf文件结构-段 节 信息

    ELF文件结构: ELF文件整体结构: readelf的使用: ELF文件头信息 ELF文件节信息 文件段信息

  • Linux[ELF]: ELF文件结构简单梳理

    Linux[ELF]: ELF文件结构简单梳理 一.编译过程-ELF文件生成 二.ELF的文件概述 2.1 4种...

  • ELF文件结构

    作为一名Android开发工程师,尤其是音视频领域,NDK开发一直都是主流,但是我们是否有认真了解过我们经常使用的...

  • ELF文件结构

    ELF文件类型: ELF文件分为文件头和文件体两部分,文件头用来描述整个程序文件的组织结构,文件体则是真正的程序文...

  • ELF&PE 文件结构分析

    ELF&PE 文件结构分析 说简单点,ELF 对应于UNIX 下的文件,而PE 则是Windows 的可执行文件,...

  • Return-to-dl-resolve

    前置知识:ELF可执行文件由ELF头部,程序头部和其对应的段,节头部表和其对应的节组成。ELF文件结构如果想深入了...

  • Android 解析so文件

    1). so文件结构 2). elf文件的数据结构类 3). 解析 #参考文章 Android逆向之旅---SO(...

  • ELF 和DEX 文件格式详解

    ELF 文件格式 linux Elf 文件格式,windows pe文件 ELF 文件由三部分组成: ELF文件头...

  • 程序编译链接(三)-- ELF文件格式

    ELF文件头 ELF目标文件格式的最前部是ELF文件头,它包好了描述整个文件的基本属性,比如ELF文件版本,目标机...

  • 005.使用IAR生成HEX与ELF文件

    使用IAR生成HEX与ELF文件 [if !supportLists]1、[endif]什么是ELF文件 ELF:...

网友评论

      本文标题:ELF文件结构

      本文链接:https://www.haomeiwen.com/subject/sactfltx.html