何为elf文件

What is elf file

ELF(**Executable and Linking Format), elf文件是Linux下定义的一种格式.

1.1 elf type

广义上elf文件不止包含后缀为elf的.*elf文件

ELF文件有三种类型:

  • 可重定位的对象文件(Relocatable file)

.o文件是由汇编器汇编生成的对象文件, 里面包含的内容就是01这样的机器可执行的指令, 当程序要执行时还需要进行链接(link). 链接就是把多个.o链接成一个可执行文件.

.a文件, .a文件是多个.o文件的组合.

  • 可执行的对象文件(Executable file)可执行应用程序

    嵌入式中.elf文件, 后缀为elf的文件

    Windows下的.exe

  • 可被分享的对象文件(Shared object file)动态库吻恶恶贱, 也即.so文件

1.2 how generate elf file

编译过程:

预编译>编译>汇编>link>生成elf

1.3 elf结构

ELF文件由4部分组成, 分别是ELF头(ELF header), 程序表头(Program header table), 节(Section)和节头表(Section header table). 实际上, 一个文件中不一定包含全部内容, 而且它们的位置也未必如同所示这样安排, 只有ELF头的位置是固定的, 其余各部分的位置, 大小等信息由ELF头中的各项值来决定.

  • ELF头部(ELF_Header): 每个ELF文件都必须存在一个ELF_Header, 这里存放了很多重要的信息用来描述整个文件的组织, 如: 版本信息, 入口信息, 偏移信息等. 程序执行也必须依靠器提供的信息.
  • 程序头部表(Program_Header_Table): 可选的一个表, 用于告诉系统如何在内存中创建映像, 再图中也可以看出来, 有程序头部表才有段, 有段就必须有程序头部表. 其中存放各个段的基本信息(包括地址指针).
  • 节区头部表(Section_Header_Table): 类似于Program_Header_Table, 但与其相对应的是节区(Section).
  • 节区(Section): 将文件分成一个个节区, 每个节区都有其对应的功能, 如符号表, 哈希表等.
  • 段(Segment): 将文件分成一段一段映射到内存中. 段中通常包括一个或多个节区