鱼C论坛

 找回密码
 立即注册
查看: 2131|回复: 0

[学习笔记] OMF目标文件的解析

[复制链接]
发表于 2021-3-6 16:14:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


  
1、  目标文件格式解析

        (1)     目标文件格式概述

目标文件是由源代码编译但未链接的中间文件,它与可执行文件的内容与结构十分相似,目标文件的格式主要有COFFELFOMF等格式。下面以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,此处的模块名称应与模块开始记录相匹配,长矩形阴影表示两字节留用,短矩形表示一字节留用,默认设为0000H00H,此处记录表可得到该模块的存储区。


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。源文件名称由一字节的名称长度和相应长度的字符串组成。






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 15:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表