首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OMF和COFF格式有什么区别?

OMF和COFF格式有什么区别?
EN

Stack Overflow用户
提问于 2009-06-08 19:40:48
回答 1查看 11.3K关注 0票数 13

最近,我一直在维护一个用VC++ 6.0编写的遗留项目。代码使用了这个编译器的许多独特特性,因此将其移植到最近的标准编译器已经证明是一项艰巨的任务。

在项目中的数千行代码中,有四个汇编程序文件。由于某些原因,我不明白,MASM615和TASM也不能编译它们(它们发送错误),但是我有对象文件。但是,当我链接库时,我会收到一条消息。

警告LNK4033:将对象格式从OMF转换为COFF

库按预期工作,但我一直在想,这些二进制格式之间有什么区别,或者我是否应该期望从这种转换中得到一些丑陋的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-08 19:59:55

从"MetaWINDOW FAQ - OMF vs COFF对象文件Formats.htm“中删除的答案

自从PC文明发展到微软Win32编程工具问世之时,几乎所有的PC编译器都使用英特尔对象模块格式(OMF)标准生成目标文件。后来,英特尔推出了386个处理器和32位保护模式,在这两种模式下,它们还扩展了32位的OMF规范,导致"OMF-386“成为大多数PC保护模式环境的标准。与此同时,最初的Windows开发团队也在设计代码,不仅适用于Intel处理器,而且还支持其他厂商的处理器。Microsoft NT团队选择了一种更可移植的对象模块格式,称为公共对象文件格式(,COFF ),它来自于UNIX系统的官方对象代码格式。COFF对象模块后来成为所有微软Win32开发工具的事实上的标准,并且在格式上与可移植可执行文件( Win32的本地可执行格式( COFF-format linker )相比,从COFF文件创建32位EXE或DLL的工作要比从OMF格式文件中创建32位EXE或DLL少得多。

正如有OMF-和COFF格式的对象文件(..obj)一样,还有OMF和COFF格式库文件(..lib)。幸运的是,库基本上只是对象文件的集合,还有一些头部信息,这些信息可以让链接器决定从库中使用哪些对象文件。然而,为了使事情变得更加困难,OMF和.lib都使用相同的文件扩展名来引用两种不同类型的对象和库文件格式(正因为如此,您不能只看文件扩展名来判断对象模块或库文件是OMF还是.lib)。

混合来自不同编译器供应商的对象文件和库文件的问题是,一些供应商支持COFF,另一些供应商使用OMF,少数厂商可以同时处理这两种情况。例如,Borland仍然使用OMF对象文件和库,而微软的32位编译器则生成COFF格式文件。Watcom C/C++ v11.0在编译和链接Windows应用程序时似乎更喜欢COFF,但是生成OMF对象文件,以便与它们的DOS4GW 32位保护模式DOS扩展程序一起使用。同时,MicrosoftMASM6.13默认生成OMF文件,但是使用/coff开关可以发出COFF对象文件。

当涉及到链接不同格式的文件时,不同的链接器会做不同的事情。例如,Microsoft Visual C/C++链接器是为COFF格式的对象文件和库设计的,但在必要时将尝试将OMF对象文件转换为COFF文件。这在某些情况下是可行的,但不幸的是,Microsoft LINK并不支持所有OMF记录类型,因此在许多情况下,当给定OMF格式的对象文件时,链接器仍然可能失败。此外,尽管Microsoft LINK尝试对OMF对象文件提供一些支持,但它将拒绝处理任何OMF格式库。其他链接器,如Borland的TLINK,是为OMF对象文件设计的,并且同样拒绝使用COFF格式的对象或库文件。一些DOS扩展程序和嵌入式系统供应商,如Phar Lap,提供了支持OMF和COFF的自己的链接器,为您提供了一个选择。

底线是,将OMF和COFF对象和库文件类型混合在一起可能会变得一团糟(再加上链接器发出的神秘错误消息也没有帮助)。除非您的链接器特别支持它,否则您应该坚持为编译器/链接器/平台推荐的对象和库格式,并避免混合OMF和COFF文件。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/966597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档