【问题标题】:Can an OMF file generated by Windows tools be linked into a GCC assembly in linux?Windows 工具生成的 OMF 文件可以链接到 linux 中的 GCC 程序集吗?
【发布时间】:2015-08-29 20:52:51
【问题描述】:

我正在将一个 Windows VC++ 应用程序移植到 Linux,该应用程序链接到当前由 MASM 生成的汇编程序模块。在将其 Windows ABI 假设更改为 Linux ABI 后,我想再次将 MASM 上的模块组装为 OMF(在 Windows 中),然后直接将该目标文件输入到 GCC 构建中(在 Linux 中)。随着时间的推移,这将大大简化维护,并保证在两个操作系统下都可以进行相同的组装。另一种方法是将汇编代码移植到 YASM/NASM 及其复杂性。汇编代码完全是叶例程(没有调用),没有宏、没有 Unicode 数据和很少的整数/实数数据;它包括 32 位和 64 位汇编器版本。除了字节序问题,谁的工具链为这个模块生成 OMF 表示真的很重要吗?

【问题讨论】:

  • 如果你有 MASM 使用它的默认 PECOFF 输出格式,你可能会有更好的运气。 GNU 链接器支持 PECOFF,但如果链接器可以同时支持 PECOFF 和 ELF,我不支持。您可能需要先使用 objcopy 进行转换。
  • 正如您所指出的,我确实对 OMF 有误,进一步阅读证实它是 PE/COFF。但是思路是一样的,听起来你说我可以使用objcopy将PE/COFF转换为ELF格式。这很方便,让我更接近,但有人提到了 Microsoft PE/COFF 和 Linux 品种之间的区别,这可能是也可能不是问题。
  • 没有 Linux 版本的 PECOFF,它完全是微软的东西。 PECOFF 基于 Unix System V COFF,但 Linux 也不使用 COFF。无论如何,在生成 Linux ELF 可执行文件时,您似乎可以直接将 PECOFF 目标文件与 GNU 链接器一起使用。它适用于我使用 NASM 组装的简单示例。

标签: linux visual-c++ gcc assembly omf


【解决方案1】:

我使用一个简单的测试用例对其进行了测试,在 Linux 下使用 GNU 链接器进行链接时它运行良好。所以你可能不需要做任何特别的事情。

这是我测试过的程序集文件:

_TEXT   SEGMENT USE32
    PUBLIC  foo
foo:
    mov eax, 1234
    ret
_TEXT   ENDS

    END

这是 C 程序:

#include <stdio.h>

extern int foo();

int
main() {
        printf("%d\n", foo());
        return 0;
}

我在 Windows 上使用 MASM 组装了第一个文件,将生成的 .OBJ 文件复制到 Linux 机器 (Debian x86_64) 并使用以下命令对其进行编译/链接:

gcc -m32 main.c foo.obj

运行生成的可执行文件 (a.out) 会产生预期的输出:1234。我还测试了等效的 64 位案例,它也能正常工作。

除非您依赖于特定于 PECOFF 的部分(段)排序或其他特定于 PECOFF 的功能,否则看起来您应该没有任何问题,至少目标文件格式可以使用。请注意,安装在您的 Linux 机器上的 GNU 链接器版本可能不是在构建时支持 PECOFF。在这种情况下,您可能需要从源代码构建自己的版本。

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2012-10-30
    • 2010-11-20
    • 2017-01-15
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多