可重定位对象模块格式(OMF)是主要用于在Intel 80x86微处理器上运行的软件的目标文件格式。 它最初由Intel开发,名称为对象模块格式,也可能是DOS用户最了解的.OBJ文件。 它已经被工具界面标准委员会标准化了。
文件格式
许多对象文件格式由一组表格组成,例如重定位表,它们存储在文件中的固定位置,如a.out格式,或者由标题指向,如ELF格式。 “区段”,代码,数据区等在这些文件中作为连续的字节区域存储。
然而,可重定位对象模块格式被设计为在链接时需要最少的内存,并且包含具有以下格式的一系列记录:
尺寸 | 内容 |
1字节 | 记录类型,例如重定位信息 |
2字节 | 数据长度(N+1) |
N字节 | 数据(取决于记录类型) |
1字节 | 校验或0 |
由于多个供应商的OMF变体的整合,并添加了32位代码和动态链接等功能,因此存在多种记录类型,重要记录类型有:
- l COMENT - (88h)评论,尽管它的名字也可能包含控制信息。
- l EXTDEF - (8Ch)定义外部引用
- l PUBDEF - (90h / 91h)标识本模块中的外部符号
- l SEGDEF - (98h / 99h)标识段
- l GRPDEF - (9Ah)标识段的组,例如MS-DOS DGROUP
- l FIXUPP - (9Ch / 9Dh)修正或重定位记录
- l LEDATA - (A0h / A1h)包含代码或数据部分的文本
- l COMDEF - (B0h)未初始化的公共数据
- l COMDAT - (C2h / C3h)初始化公共数据
- l MODEND - (8Ah / 8Bh)表示模块结束
在文件中没有包含文件偏移量的头,例如指向符号表的指针; 链接器必须完全解析对象文件才能提取所有信息。
在OMF格式中,一个部分的数据不一定作为文件中的连续字节存储,而是可以由多个记录表示。 文件格式规范(版本1.1)说,必须对大于1 KiB的部分进行此操作。 包含重定位信息(fixup)的记录必须紧随其应用的部分的数据记录存储,因此文件中的部分数据和重定位信息是“混合的”。
文件格式提供允许在对象文件中压缩重复数据序列的特殊记录(LIDATA)。 它还提供将稍后可执行文件的入口点的符号名称存储在一个目标文件中的可能性。
文件格式也可以用作库文件格。
使用
文件格式是MS-DOS,16位Windows和16位和32位OS / 2下最重要的对象文件格式。
只有很少的工具链使用32位版本的OMF格式。 例如,Watcom C工具链允许为使用32位分段内存布局的目标生成代码; Iron Spring PL / I可以生成OS / 2 32位平面内存布局的代码。
Embarcadero Delphi编译器在为C ++生成obj文件时使用此格式。