马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 墙里秋千墙外荡 于 2021-3-6 16:43 编辑
1、 目标文件格式解析
(1) 目标文件格式概述
目标文件是由源代码编译但未链接的中间文件,它与可执行文件的内容与结构十分相似,目标文件的格式主要有COFF、ELF、OMF等格式。下面以OMF格式为例描述如何从目标文件中获取调试信息。
OMF格式是目前还在使用的最古老的格式之一,在一些嵌入式系统中就是使用这种目标文件格式存储调试信息的。
(2) OMF记录格式
OMF出现在微处理器开发的早期,当时内存容量都很小。因此,OMF将目标文件划分成一系列短记录,OMF在这一点上也是如此,如图1所示,每个记录包含1字节的类型,2字节的长度,内容,和可以让整个记录的字节和为零的校验字节。
(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,其中段标志指定为00H,表示代码段,两字节的段内偏移表示首个数据在代码段的段内偏移,这里的数据为二进制的指令码。
d) 范围记录
范围记录的记录类型为10H,此记录用于将“调试项目记录”中的符号和行号的范围限制为源程序定义的块。
块类型字段可以采用以下值:
模块开始块(00H),为每个模块生成一次。这种类型的范围定义记录应该是模块中的第一个调试记录,因为它将模块中的整个调试信息(包括其各自的模块结束类型范围定义记录)包含在内。
DO开始块(01H),为每个包含其块中的声明的简单DO语句生成。
程序开始块(02H),为每个程序生成,该语句包含过程块中的声明。
模块结束块(03H),为每个关闭模块的END语句生成。此记录中的块名称必须与最后一个模块开始块定义的名称匹配。
DO结束块(04H),为每个关闭DO块的END语句生成。此记录中的块名称必须与上次打开的DO开始块定义 的名称匹配 。
程序结束块(05H),为每个关闭程序块的END语句生成。此记录中的块名称必须与上次打开的程序开始块范定义 的名称匹配 。
e) 调试项目记录
调试项目记录的记录类型为22H,它提供有关模块、DO块、程序块的本地符号,公共符号,段符号和行号等调试信息。
定义类型指定了该调试项目记录在此记录中定义的项目:
本地符号(00H);公共符号(01H);段符号(02H);行号(03H)。
f) 源文件记录
源文件记录的记录类型为24H,它提供了范围记录中模块的源文件信息,其中阴影块为三字节的留用空间,默认设为000000H。源文件名称由一字节的名称长度和相应长度的字符串组成。
|