【编译汇编链接】COFF文件及结构说明

1,241 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

如果在看这篇文章之前你并不了解代码是如何编程可行文件的可以看一下我的这边文章:   【编译汇编链接】C++代码文件到可执行的过程   只需要一两眼的时间吼~~💤

@[toc]

COFF文件说明

coff文件本质上就是代码在编译阶段产生的文件。

  1. 在windows系统上,准确说是使用visual studio生成时,会产生==obj文件==,一般都保存在与代码同级的Release或Debug目录下;
  2. 在linux上使用gcc进行编译操作时,生成的是==out文件==。

那么再来看一下COFF文件的官方定义:

COFF——通用对象文件格式(Common Object File Format),是一种很流行的对象文件格式(注意:这里不说它是“目标”文件,是为了和编译器产生的目标文件(.o/.obj)相区别,因为这种格式不只用于目标文件,库文件、可执行文件也经常是这种格式)。使用vs所产生的目标文件(*.obj)就是这种格式。其它的编译器,如GCC(GNU Compiler Collection)、ICL(Intel C/C++ Compiler)、VectorC,也使用这种格式的目标文件。不仅仅是C/C++,很多其它语言也使用这种格式的对象文件

==统一格式的目标文件为混合语言编程带来了极大的方便。==

当然,并不是只有这一种对象文件格式。常用格式的还有OMF-对象模型文件(Object Module File)以及ELF-可执行及连接文件格式(Executable and Linking Format)。OMF是一大群IT巨头在n年制定的一种格式,在Windows平台上很常见。大家喜欢的Borland公司现在使用的目标文件就是这种格式。MS和Intel在n年前用的也是这种格式,现在都改投异侧,用COFF格式了。ELF格式在非Windows平台上使用得比较多,在Windows平台基本上没见过。

COFF文件结构

COFF文件一共有8种数据,如下表所示,其中段落头和段落数据可以有多节。默认情况下,COFF文件包含3个段:.text:通常包含可执行代码;.data:通常包含已初始化的数据;.bss:通常为未初始化的数据保留空间。

其中,文件头~行号入口表与加载文件密切相关。

COFF文件结构说明描述示例
File header文件头用来保存COFF文件的基本信息,如文件标识,各个表的位置等等,如右图所示段落头
Optional Header可选头类似于文件头,也是用来保存信息的,主要保存在文件头中没有描述到的信息。
Section Header段落头用来描述段落信息的,每个段落都有一个段落头来描述,段落的数目会在文件头中指出。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgC9rEzc-1645848852703)(Untitled/image-20220226114915546.png)]……
Section Header n
Section Data段落数据段落数据通常是COFF文件中最大的数据段,每个段落真正的数据就保存在这个位置,可以从段落头的描述中看到相关信息。段落数据
Relocation Directives重定位表这个表通常只存在于目标文件中,他用来描述COFF文件中符号的重定位信息。
Line Numbers行号表
Symbol Table符号表用来保存COFF文件中所用到的所有符号的信息,链接多个COFF文件时,这个表帮助我们重定位符号。调试程序时也要用到它。关于Windows COFF符号表的理解 - 橘崽崽啊 - 博客园
String Table字符串表保存字符串的。用于保存一些字符个数超出了符号表和去段头的名称数组最大个数的字符串。

本文参考

  1. coff文件简单分析_zzljn的专栏_coff文件解析
  2. 苗军, 倪奇志, MIAOJun,等. COFF文件分析提取器的实现及其应用[J]. 现代电子技术, 2009, 32(2):4.
  3. COFF文件的格式_redleaves的专栏_coff

在此感谢以上诸位知识的共享,好人必有好报!!!