美文网首页
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 */
    

    相关文章

      网友评论

          本文标题:ELF文件结构

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