Visual c++ 什么';OMF和COFF格式的区别是什么?

Visual c++ 什么';OMF和COFF格式的区别是什么?,visual-c++,arm,coff,omf,Visual C++,Arm,Coff,Omf,最近我一直在维护一个用VC++6.0编写的遗留项目。该代码使用了该编译器的许多独特特性,因此将其移植到更新的标准编译器已被证明是一项艰巨的任务 在项目中的数千行代码中,有四个汇编程序文件。由于某些原因,我不明白,MASM615和TASM都不能编译它们(它们发送错误),但是我有目标文件。然而,当我链接库时,我收到一条消息 警告LNK4033:将对象格式从OMF转换为COFF 该库按预期工作,但我一直想知道这些二进制格式之间的区别是什么,或者我是否应该期待这种转换会带来一些不好的结果。回答“Meta

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

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

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

该库按预期工作,但我一直想知道这些二进制格式之间的区别是什么,或者我是否应该期待这种转换会带来一些不好的结果。

回答“MetaWINDOW FAQ-OMF vs COFF Object File formats.htm”

从PC文明的曙光到微软Win32编程工具的出现,几乎所有PC编译器都使用英特尔对象模块格式(OMF)标准生成对象文件。后来,英特尔推出了386处理器和32位保护模式,在这一点上,他们还将OMF规范扩展为32位,导致“OMF-386”成为大多数PC保护模式环境的标准。大约在同一时间,最初的Windows NT开发团队也在设计代码,不仅是为英特尔处理器设计的,而且也是为了支持其他供应商的处理器。Microsoft NT团队选择了一种更具可移植性的对象模块格式,称为通用对象文件格式(COFF),该格式源自UNIX System V的官方对象代码格式。COFF对象模块后来成为所有Microsoft Win32开发工具的事实标准,并且在格式上更接近可移植可执行文件(Win32的本机可执行格式)方面获得了优势(COFF格式链接器从COFF文件创建32位EXE或DLL的工作量要比从OMF格式文件创建32位EXE或DLL的工作量小得多)

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

混合来自不同编译器供应商的对象文件和库文件的问题是,一些供应商支持COFF,其他供应商使用OMF,少数供应商可以同时处理这两种文件。例如,Borland仍然使用OMF对象文件和库,而微软的32位编译器生成COFF格式的文件。Watcom C/C++v11.0在编译和链接Windows应用程序时似乎更喜欢COFF,但会生成OMF对象文件,以便与DOS4GW 32位保护模式DOS extender一起使用。除此之外,Microsoft MASM 6.13默认生成OMF文件,但使用/coff开关可以生成coff对象文件

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


归根结底,混合使用OMF和COFF对象和库文件类型可能会造成混乱(加上来自链接器的神秘错误消息也无济于事)。除非你的链接器特别支持它,否则你应该坚持为你的编译器/链接器/平台推荐的对象和库格式,并避免混合OMF和COFF文件。

看一看。@avakar:为什么不将该链接转换成正确的答案?@avakar的链接已失效,但仍可以在底线上找到,而似乎是他的链接器进行了转换。它不会产生错误。但并非所有转换都顺利进行。如果它们有任何运行时错误或函数故障,请首先查看lib中的这个lib或obj或obj。当然,所有的链接器都必须在最后创建一个PE-COFF可执行文件才能在windows平台上运行吗?也就是说,在链接过程之后,最终生成的可执行文件是否可以包含特定于另一种对象格式(如OMF)的数据和结构?如果是这样的话,它是如何工作的?(或者这怎么行?)不太可能。COFF位可以直接进入PE格式。阅读avakar在主要问题下提供的链接。这个链接比我的剪贴小存根更好。然而,当你阅读那篇文章时,你必须让你所有的神经元都被激活并在线。下载并慢慢阅读。我学的不多。