【发布时间】: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