将COFF库文件转换为OMF格式

7

有没有办法将COFF库(lib文件)转换为OMF库,以便与C++Builder6一起使用? 这个coff不仅是导入库,它还包含一些代码。 当我尝试使用Borland的coff2omf.exe进行转换时,我从15KB的文件中得到1KB的文件。

5个回答

7

您可以使用objconv(位于agner.org/optimize)代替DigitalMars转换器,用于将目标文件在COFF/PE、OMF、ELF和Mach-O格式之间进行转换。可修改目标文件中的符号名称。可在不同平台上构建、修改和转换函数库。可转储目标文件和可执行文件。还包括一个支持SSE4、AVX、AVX2、AVX512、FMA3、FMA4、XOP和Knights Corner指令集的非常好的反汇编器。源代码已包含在内(GPL许可)。

这是一个很好的低级优化网站,在相关手册PDF文件中有关于跨多个平台的库格式的大量有用信息。


2

OMF目标文件通常比等效的COFF目标文件小得多,所以你得到的可能是有效的。

如果你发现它真的无效,那么你可以将lib文件分解为单独的目标文件,反汇编这些目标文件,重新组装它们成为OMF目标文件,然后将它们放在一起形成一个OMF lib文件。


谢谢您的回答。 您能推荐一些我可以使用的工具,用于反汇编COFF对象文件然后重新组装为OMF对象文件吗? - CITBL
假设您正在运行Windows操作系统,您可以使用“dumpbin /disasm the_file.obj”来反汇编COFF对象。这将生成一些准备好供MASM使用的输出,尽管您需要去掉它添加的一些额外列。如果您不介意花费一些钱,IDA Pro将产生直接可供MASM使用的结果。无论哪种方式,我可能会使用MASM进行汇编。 - Jerry Coffin
Jerry,你能否提供一些在MASM中运行命令的示例吗?我正在尝试这样做,但不确定如何调用MASM(或需要从“dumpbin”输出中删除哪些列)。 - Mark LeMoine
@MarkLeMoine:通常调用MASM的命令是ml /c source_file.asm。至于dumpbin,您将使用dumpbin /disasm object_file,然后剪切源代码的部分。在大多数情况下,您需要手工添加(至少)像CPU、MODEL和END指示符,可能还要适当地添加PROC/ENDP等等。在左侧,您将有一个地址和指令字节,您还需要切掉它们,只留下实际的指令/操作数。它使用地址作为标签,因此您也需要在适当的位置添加真实的标签。 - Jerry Coffin

1
值得注意的是,在新版本的Delphi(>=XE2),编译器接受COFF和OMF格式。C++ Builder可能也是如此。64位编译器仅使用COFF格式。有关链接COFF的更多信息,请参见这里

1
这可能有点晚了,但是如果有人正在寻找答案,可以从DigitalMars的COFFIMPLIB进行检查。COFF2OMF也可在同一网站上找到,但看起来它已经过时了。

0

将Delphi(omf)和Ada(gcc,coff)集成需要很多努力,直到我放弃了在单个exe中完成它。

老实说,我尝试将gcc rtl和ada rtl .a(coff库)分解为许多.o(对象),通过coff2omf进行转换(有DMD coff2omf和iirc另一个convobj或类似的工具)。一些coff .o无法转换为.obj,所以我无法确定这是否是可靠的方法。

当涉及异常和其他深层细节时,汇编级别的转换并不简单。

遗憾的是,我没有尝试过一个名为ftp://ftp.styx.cabel.net/pub/UniLink/的工具

虽然不明显,但UniLink可能可以用于实现目标。其中一个目标是C++ Builder包(动态和静态)。unilink -Tpp -GI应该可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接