目标文件格式

参考文章:https://vinoit.me/2016/11/09/programmer-self-culture-link-load-and-lib-notes/

       ELF, Executable and Linking Format, 是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。 ELF格式是是UNIX系统实验室作为ABI(Application Binary Interface)而开发和发布的。

这里简单介绍一下相关历史:

UNIX: 最初采用的格式为a.out,之后被System V中的COFF取代,最后则被SVR4中的ELF格式所取代。

  • Windows: 采用的则是COFF格式的变种PE格式
  • MAC OS X: 采用的是Mach-O格式

ELF有四种不同的类型:

  1. 可重定位文件(Relocatable): 编译器和汇编器产生的.o文件,需要被Linker进一步处理
  2. 可执行文件(Executable): Have all relocation done and all symbol resolved except perhaps shared library symbols that must be resolved at run time
  3. 共享对象文件(Shared Object): 即动态库文件(.so)
  4. 核心转储文件(Core File):

目标文件格式

       编译器编译源代码后生成的文件称为目标文件,事实上,目标文件是按照可执行文件的格式存储的,二者结构只是稍有不同。Linux下的目标文件和可执行文件可以看成一种类型的文件,统称为ELF文件,一般有以下几类:

可重定位文件:如.o文件,包含代码和数据,可以被链接成可执行文件或共享目标文件,静态链接库属于这一类。
可执行文件:如/bin/bash文件,包含了可以直接执行的程序,一般没有扩展名。
共享目标文件:如.so文件,包含代码和数据,可以跟其他可重定位文件和共享目标文件链接产生新的目标文件,也可以跟可执行文件结合作为进程映像的一部分。
目标文件由许多段组成,其中主要的段包括:

代码段(.text):保存编译后得到的指令数据。
数据段(.data):保存已经初始化的全局静态变量和局部静态变量。
只读数据段(.rodata):保存只读变量和字符串常量,有些编译器会把字符串常量放到”.data”段。
BSS段(.bss):保存未初始化的全局变量和局部静态变量。
除了这几个常用的段之外,ELF可能包含其他的段,保存与程序相关的信息,如:
.comment 编译器版本信息
.debug 调试信息
.dynamic 动态链接信息
.hash 符号哈希表
.line 调试时的行号表,源代码行号与编译后指令的对应表
.note 额外的比编译器信息
.strtab String Table,字符串表,存储用到的各种字符串
.symtab Symbol Table,符号表
.shstrtab Section String Table,段名表
.plt 动态链接跳转表
.got 动态链接全局入口表
.init 程序初始化代码段
.fini 程序终结代码段

ELF文件组成部分

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值