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

时间:2015-08-29 20:52:51

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

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

1 个答案:

答案 0 :(得分: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;
}

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

gcc -m32 main.c foo.obj

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

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