Windows 工具生成的 OMF 文件可以链接到 linux 中的 GCC 程序集吗?

Can an OMF file generated by Windows tools be linked into a GCC assembly in linux?

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

我使用一个简单的测试用例对其进行了测试,并且在 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)并使用 compiled/linked以下命令:

gcc -m32 main.c foo.obj

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

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