Linux教程

Linux下ELF文件简单介绍

本文主要是介绍Linux下ELF文件简单介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

引言

最开始有在树莓派中看见ELF文件,故在此进行记录

ELF文件介绍

Executable and Linkable Format 可执行链接格式(ELF),是Unix系统实验室(USL)作为应用程序二进制接口而开发和发布的。

ELF目标文件有三种类型:

  1. 可重定位文件:保存代码和适当的数据,用来和其他object文件一起创建一个可执行文件或共享文件

  2. 可执行文件:保存一个用来执行的程序,该文件指出了如何来创建程序进程映像

  3. 共享目标文件:包含了在两种使用环境中链接的代码和数据。

    • 首先,链接器(ld)可以将它和其余可重定位文件和共享目标文件一起处理,生成另外一个目标文件
    • 其次,动态链接器可将它与某个可执行文件以及其他共享目标文件按组合在一起创建进程映像

三种类型的ELF文件结构都是相同的

ELF文件的结构

主要由四部分组成:

  • ELF header
  • Program header table
  • Sections
  • Section header table

ELF header

#define EI_NIDENT 16
typedef struct{
  unsigned char   e_ident[EI_NIDENT];    //占用16个字节
  Elf32_Half      e_type;                //Elf32_Half表示是2个字节大小,代表文件的类型
  Elf32_Half      e_machine;             //代表运行该程序需要的体系结构 
  Elf32_Word      e_version;            //Elf32_Word表示4个字节大小,代表文件版本
  Elf32_Addr      e_entry;              //Elf32_Addr表示4个字节大小,代表程序的入口地址
  Elf32_Off       e_phoff;              //Elf32_Off表示4个字节大小,是`Program header table`在文件中的偏移量
  Elf32_Off       e_shoff;              //是`Section header table`在文件中的偏移量
  Elf32_Word      e_flags;              //保存着相关文件的特定处理器信息
  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;

Section header table

typedef struct{
    Elf32_Word sh_name;   //节区名,是节区头部字符串表节区(Section Header String Table Section)的索引。名字是一个 NULL 结尾的字符串。
    Elf32_Word sh_type;    //为节区类型
    Elf32_Word sh_flags;    //节区标志
    Elf32_Addr sh_addr;    //如果节区将出现在进程的内存映像中,此成员给出节区的第一个字节应处的位置。否则,此字段为 0。
    Elf32_Off sh_offset;    //此成员的取值给出节区的第一个字节与文件头之间的偏移。
    Elf32_Word sh_size;   //此 成 员 给 出 节 区 的 长 度 ( 字 节 数 )。
    Elf32_Word sh_link;   //此成员给出节区头部表索引链接。其具体的解释依赖于节区类型。
    Elf32_Word sh_info;       //此成员给出附加信息,其解释依赖于节区类型。
    Elf32_Word sh_addralign;    //某些节区带有地址对齐约束.
    Elf32_Word sh_entsize;    //某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。
}Elf32_Shdr;

Program header table

typedef struct {  
    Elf32_Word p_type;           //此数组元素描述的段的类型,或者如何解释此数组元素的信息。 
    Elf32_Off  p_offset;           //此成员给出从文件头到该段第一个字节的偏移
    Elf32_Addr p_vaddr;         //此成员给出段的第一个字节将被放到内存中的虚拟地址
    Elf32_Addr p_paddr;        //此成员仅用于与物理地址相关的系统中。System V忽略所有应用程序的物理地址信息。
    Elf32_Word p_filesz;         //此成员给出段在文件映像中所占的字节数。可以为0。
    Elf32_Word p_memsz;     //此成员给出段在内存映像中占用的字节数。可以为0。
    Elf32_Word p_flags;         //此成员给出与段相关的标志。
    Elf32_Word p_align;        //此成员给出段在文件中和内存中如何对齐。
} Elf32_phdr;

总结

这个也只是简单的介绍了一下ELF文件,并没有对该文件进行具体的分析 我好菜

如果需要更细致的分析,请点击参考链接

参考文章

ELF文件格式解析
知乎专栏

这篇关于Linux下ELF文件简单介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!