0

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

4

1 回答 1

2

我使用一个简单的测试用例对其进行了测试,在 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;
}

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

gcc -m32 main.c foo.obj

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

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

于 2015-08-30T00:58:58.233 回答