COFF文件格式_第1页
COFF文件格式_第2页
COFF文件格式_第3页
COFF文件格式_第4页
COFF文件格式_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、COFF文件格式简介Coff:公共目标文件格式coff(公共目标文件格式)是一种流行的目标文件格式(注意:这里它不是一个“目标”文件,因为它不同于目标文件(*)。o/*。obj)由编译器生成,因为这种格式不仅用于目标文件,还用于库文件和可执行文件)。这是目标文件(*)的格式。由VC生成。其他编译器,如GCC(GNUCompilerCollection)、ICL(IntelC/C编译器)和向量编译器,也使用这种格式的目标文件。不仅是C/C,许多其他语言也使用这种格式的目标文件。目标文件的统一格式给混合语言编程带来了极大的便利。当然,这不是唯一的目标文件格式。常用的格式有OMF-对象模块文件和EL

2、F-可执行的链接格式。OMF是一个由一大群信息技术巨头在N年内制定的格式,在Windows平台上非常常见。这是博兰公司使用的目标文件格式,每个人都喜欢。微软和英特尔在n年前使用了相同的格式,但现在他们转而使用COFF格式。极低频格式在非视窗平台上被广泛使用,但在视窗平台上从未出现过。作为一名程序员,有必要了解你经常打交道的这些人!但这次让我先介绍COFF!在COFF文件格式中,偏移量COFF文件格式总体结构图文件头可选标题章节标题部分数据重定位指令行号符号表字符串表文件的结构基本上是这样的。它有点丑,但它的设计师有点远见。可伸缩性设计得如此之好,以至于它至今仍在使用。了解了文档的整体结构,现在

3、让我们逐段分析它。COFF文件中有8种数据,从上到下如下:1.文件头(文件头)2.可选标题(可选标题)3.章节标题截面数据(截面数据)5.重定位指令6.行号表(行号)7.符号表8.字符串表COFF头球typedef struct _ IMage _ FILE _ HEADER文字机器;/检查的字数;/部分DWORD时间日期戳;/通常是生成此文档的时间双字指针符号表;/符号表的文件偏移地址符号的双字数;/符号表的数量选项标题的字长;/0没有在obj文件中使用词汇特征;/0没有在obj文件中使用图像_文件_标题,* PIMAGE _ FILE _标题;部分(部分目录部分数据)每个段和重定位头的内容

4、(这个重定位头不一定存在于每个段中,但似乎只存在于。不确定的文本段),该部分的偏移地址由段标题指定。typedef struct _ IMage _ SECTION _ HEADER字节名IMage _ SIZEOF _ SHORT _ Name;联合双字物理地址;DWORD VirtualSize杂项;/在obj文件中没有使用DWORD VirtualAddressDWORD SizeOfRawData/大小数据仓库指针原始数据;/偏移双字指针重定位;/重定位头文件偏移量双字指针行号;/位置的字数;/重新着色数数字的字数;/数据仓库特征;/部分属性 IMAGE_SECTION_HEADER,

5、* PIMAGE _ SECTION _ HEADER重新定位表既然有手表,就有记录。重定位表中的每个记录都是一条重定位信息。该记录的结构非常简单,如下所示:typedefstructunsignedlongulAddr/定位偏移unsignedlongulSymbol/符号未指定的短整型;/定位类型 RELOC很简单,只有三个成员!UlAddr是要在段中定位的内容的偏移量。例如,如果一个体段从0x010开始,并且ulAddr值是0x05,那么您的定位信息应该写在0x15。此外,信息的长度取决于代码的类型。32位代码需要写入4个字节,16位代码只需要2个字节。UlSymbol是一个符号索引,它

6、指向符号表中的一条记录。请注意,这是一个索引,而不是一个偏移量!它只是符号表中记录的记录号。该成员指示重定位信息映射到的符号。UsType是重新定位类型的标识。在32位代码中,通常只有两种定位方法。一个是绝对定位,另一个是相对定位。代码如下:值名称描述6RELOC_ADDR3232位绝对定位。20RELOC_REL3232位相对定位。对于不同的处理器,这些值是不同的。以下是i386平台上最常用的两种定位模式的标识。其定位方式如下:绝对本地化在绝对定位模式下,您应该给出符号的绝对地址(注意,有时它可能不是地址而是值。对于常数,你不必给出它的底值,只需给出它的值)。当然,这个地址不是现成的,所以您

7、需要使用符号的相对地址和它的段的相对地址来获得它的绝对地址。公式:符号绝对地址=段偏移符号偏移您需要分别从段落标题和符号表中获取这些偏移量。当然,当一个段落要被重新定位时,它必须在其中的符号被定位之前被重新定位。相对定位相对定位更加复杂。它需要的地址信息是相对于当前位置的偏移量,该偏移量是ulAddr所指向的偏移量的绝对地址后四个字节的位置(32位代码是四个字节,16位是两个字节)。也就是说,使用定位偏移当前段偏移机器字长8公式:当前地址=定位偏移量当前段偏移量机器字长8使用当前地址,相对地址很容易计算。只需从符号的绝对地址中减去当前地址。公式:相对地址=符号绝对地址-当前地址计算地址,把它写

8、在ulAddr所指的位置,一切都没问题!您已经完成了重新定位工作。行号表调试时行号表很有用。它建立了可执行二进制代码和源代码行号之间的映射关系。这样,当程序执行不正确时(事实上,正确的也可以是j),我们可以根据当前执行代码的位置知道错误源代码的行号,然后修改它。没有它,天知道哪一行出了问题!它的格式也很简单。只有两个成员,如下所示:typedefstructunsignedlongulAddrORSymbol/代码地址或符号索引unsignedshortusLineNo/行号 LINENO让我们看看第二个成员,usLineNo。这是从1开始计数的计数器,1代表源代码的行号。当行号大于0时,第一

9、个成员ulAddrORSymbol表示源代码的地址;当行号为0时,它成为与符号表中的行号相对应的符号的索引。让我们看看符号表。图例符号表是用于存储目标文件中符号信息的表,也是COFF文件中最复杂的表。段落中使用的所有符号都在此表中。它也由许多记录组成,每个记录都存储在以下结构中:typedefstruct联合charcName8;/符号名称结构unsignedlongulZero/字符串表标识unsignedlongulOffset/字符串偏移量 e; e;unsignedlongulValue/符号值快捷操作;/符号所在的部分未指定的短整型;/符号类型unsignedcharusClass/

10、符号存储类型unsignedcharusNumAux/符号的附加记录数SYMENT。像所有以前的名字一样,CName符号名也是8字节,但不同的是它是在一个联合中。UlZero和ulOffset占用相同的存储空间。如果符号的名称只有8个字符,那很好,你可以直接把它放在这个cName中;但是,如果名称超过8个字节,就不能放在这里,所以必须放在字符串表中。此时,ulZero的值将为0,我们在字符串表中使用的符号名称的偏移量将在ulOffset中给出。一个符号有名字是不够的,它还需要一个值!UlValue是由该符号表示的值。ISection成员指示此符号所在的段落。如果其值为0,则该符号是外部符号,需

11、要从其他COFF文件中解析(连接多个目标文件就是解析该符号)。当它的值为-1时,它意味着这个符号的值是一个常数,而不是它在段落中的偏移量。当它的值为-2时,这个符号只是一个调试符号,它将只在调试期间使用。当它大于0时,它是符号所在段的索引值。UsType是符号的类型标识。它用来解释这个符号的类型。它是一种功能吗?整数?或者别的什么。这个标识符是两个字节。字节的低四位是基本标记,表示符号的基本类型,如整数、字符、结构、并集等。高四位表示符号的高级类型,如指针(0001b)、函数(0010b)、数组(0011b)、无类型(0000b)等。今天的编译器通常只使用高级类型,而不是基本类型。因此,符号的

12、基本类型通常设置为0。高字节通常不被使用。UsClass是符号的存储类型标识。它指示符号是如何存储的。参见下表了解其价值和意义:值名称描述NULL0没有存储类型。自动1自动类型。通常是堆栈中分配的变量。外部2外部符号。当它是外部符号时,iSection的值应为0;如果不是0,ulValue是段中符号的偏移量。静态类型。UlValue是段中符号的偏移量。如果偏移量为0,则该符号表示线段名称。REGISTER4寄存器变量。结构构件。UlValue是结构中符号的顺序。STRUCT_TAG10结构标识符。工会会员。UlValue是联合中符号的顺序。UNION_TAG12联合标识符。类型定义13类型定义

13、。函数101函数名。文件102文件名。最后一个成员usNumAux是附加记录的数量。附加记录是用来描述符号的一些附加信息。为了便于保存,这些附加记录通常被选择为符号信息记录的整数倍(大多数是1)。因此,如果该成员的值为1,则意味着在当前符号信息记录之后附加了一条记录以保存附加信息。附加信息的结构与符号类型和存储类型有关。不同类型的符号具有不同的附加信息结构(如果有的话)。如果你不关心这些内容,你可以省略它们。当段类型为FILE时,附加信息是一个字符串,它是与目标文件相对应的源文件的名称。其他类型将在介绍PE时详细讨论。字符串表不用说,盲人可以看到这个表是用来存储字符串的。它紧跟符号表。至于你为什么要保存字符串,我已经说过了。我在这里不会说太多,只是谈谈字符串的存储格式。字符串表是所有部分中最简单。下图:0 4字符串表长度字符串10.字符串n0字符串表的前四个字节是字符串表的长度(以字节为单位)。其后是以0结尾的字符串(C样式的字符串)。应该注意的是,字符串表的长度不仅是字符串长度的总和(这个长度应该包括每个字符串后面的 0 ),而且还包括这个长度字段的四个字节。符号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论