墙里秋千墙外荡 发表于 2021-3-6 16:14:38

OMF目标文件的解析

本帖最后由 墙里秋千墙外荡 于 2021-3-6 16:43 编辑


1、目标文件格式解析
      (1)   目标文件格式概述
目标文件是由源代码编译但未链接的中间文件,它与可执行文件的内容与结构十分相似,目标文件的格式主要有COFF、ELF、OMF等格式。下面以OMF格式为例描述如何从目标文件中获取调试信息。
OMF格式是目前还在使用的最古老的格式之一,在一些嵌入式系统中就是使用这种目标文件格式存储调试信息的。
      (2)   OMF记录格式
OMF出现在微处理器开发的早期,当时内存容量都很小。因此,OMF将目标文件划分成一系列短记录,OMF在这一点上也是如此,如图1所示,每个记录包含1字节的类型,2字节的长度,内容,和可以让整个记录的字节和为零的校验字节。

记录类型记录序列长度内容校验位
图1OMF记录格式


(3)   OMF的记录类型

OMF目标文件格式有许多记录序列,这里列出一个简单的OMF文件的记录。

THEADR程序名称
COMENT标志和选项
LNAMES段、段组和段类的名字列表
SEGDEF段(每个段一个记录)
GRPDEF段组(每个段组一个记录)
PUBDEF全局符号
EXTDEF未定义的外部符号(每个符号一个记录)
COMDEF公共块
COMENT第一遍扫描信息
LEDATA代码或数据块(多个)
LIDATA重复数据块(多个)
FIXUPP重定位和外部引用修正信息
MODEND模块结尾
表1典型的OMF记录序列下面是具体的几个较为重要的调试信息记录类型介绍:


a)      模块开始记录



记录 类型 02H 记录序列长度模块名称生成标志
校验位
每个模块必须以模块开始记录开头。
模块开始记录的记录类型为02H,模块名称是一个变长的序列,有一字节的字符串长度与后面相应长度的字符串组成。
除了模块名称,记录还包含:
一个字节的生成标志位,该字节标识生成该模块的程序。
阴影的一个字节块表示该字节留用,默认为00H。


b)      模块结束记录


记录类型 04H记录序列长度模块名称
记录表
校验位
模块结束记录的记录类型为04H,此处的模块名称应与模块开始记录相匹配,长矩形阴影表示两字节留用,短矩形表示一字节留用,默认设为0000H与00H,此处记录表可得到该模块的存储区。


c)      内容记录


记录类型06H记录序列长度段标志段内偏移数据校验位
重复

内容记录的记录类型为06H,其中段标志指定为00H,表示代码段,两字节的段内偏移表示首个数据在代码段的段内偏移,这里的数据为二进制的指令码。


d)      范围记录


记录类型10H记录序列长度块类型块名称校验位
范围记录的记录类型为10H,此记录用于将“调试项目记录”中的符号和行号的范围限制为源程序定义的块。
块类型字段可以采用以下值:
模块开始块(00H),为每个模块生成一次。这种类型的范围定义记录应该是模块中的第一个调试记录,因为它将模块中的整个调试信息(包括其各自的模块结束类型范围定义记录)包含在内。
DO开始块(01H),为每个包含其块中的声明的简单DO语句生成。
程序开始块(02H),为每个程序生成,该语句包含过程块中的声明。
模块结束块(03H),为每个关闭模块的END语句生成。此记录中的块名称必须与最后一个模块开始块定义的名称匹配。
DO结束块(04H),为每个关闭DO块的END语句生成。此记录中的块名称必须与上次打开的DO开始块定义 的名称匹配 。
程序结束块(05H),为每个关闭程序块的END语句生成。此记录中的块名称必须与上次打开的程序开始块范定义 的名称匹配 。


e)      调试项目记录


记录类型22H记录序列长度定义类型内容校验位
重复
调试项目记录的记录类型为22H,它提供有关模块、DO块、程序块的本地符号,公共符号,段符号和行号等调试信息。
定义类型指定了该调试项目记录在此记录中定义的项目:
本地符号(00H);公共符号(01H);段符号(02H);行号(03H)。

f)       源文件记录


记录类型24H记录序列长度 源文件名称校验位
源文件记录的记录类型为24H,它提供了范围记录中模块的源文件信息,其中阴影块为三字节的留用空间,默认设为000000H。源文件名称由一字节的名称长度和相应长度的字符串组成。






页: [1]
查看完整版本: OMF目标文件的解析