【问题标题】:How to Convert 64bit COFF to OMF?如何将 64 位 COFF 转换为 OMF?
【发布时间】:2015-06-28 01:28:35
【问题描述】:

我需要将 64 位 .lib 文件从 COFF 转换为 OMFCoff2Omf.exe 适用于 32 位库,但提供...

ERROR: COFF error: FOOx64.lib
(coffread.cpp, 1637) : invalid machine type detected

...在 64 位库上。 是否有更新的工具或类似工具可用于此目的?

【问题讨论】:

    标签: static-libraries 32bit-64bit c++builder c++builder-xe7 omf2coff


    【解决方案1】:

    根据 Embarcadero 的文档:

    Differences Between Clang-based C++ Compilers and Previous-Generation C++ Compilers

    对象和库文件格式

    • BCC32 及其相关工具在 .obj 和 .lib 文件中使用 OMF。
    • 基于 Clang 的 C++ 编译器在 .o 和 .a 文件中使用 ELF。

    这种差异意味着,例如,当您迁移 32 位 Windows 应用程序时,您必须将对 .lib 和 .obj 文件的引用分别更改为 .a 和 .o。

    BCC64.EXE, the C++ 64-bit Windows Compiler

    编译的目标文件
    ELF64格式

    #pragma link

    只要您使用默认文件类型,就不要指定模块名称的文件扩展名 (.ext)。链接器假定模块名称的文件扩展名 (.ext) 具有以下默认值:

    • .obj BCC32 的扩展
    • .o 分机号:
      基于 Clang 的 C++ 编译器
      BCCOSX

    因此,如果您省略.ext,则会根据您当前的目标平台自动使用正确的扩展名。

    OMF 仅由 32 位编译器/链接器使用。 64 位编译器/链接器使用 ELF64 代替。

    【讨论】:

      【解决方案2】:

      我想知道 OMF 规范是否曾经存在于 64 位架构。顺便问一下,为什么需要 64 位 OMF 文件? C++Builder 上的 64 位版本基于 LLVM 编译器后端,它生成 ELF 对象文件(据我所知)

      我不知道 coff2elf 之类的东西是否与 C++Builder XE7 捆绑在一起,但是,也许你可以使用开源工具,比如“对象文件转换器”,在这里寻找它: http://www.agner.org/optimize/#objconv

      【讨论】:

      • 我有一个使用 Win SDK 库文件同时针对 32 位和 64 位的项目。我需要将它们转换为 OMF 以进行链接。但是您可能是对的,也许现在这样做有所不同?
      • OMF 仅由 32 位链接器使用。 64 位链接器使用 ELF64 代替。这记录在 Embarcadero 的 DocWiki 上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2021-01-22
      • 2014-09-11
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多