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