【问题标题】:can you compile/run masm in linux?你能在linux中编译/运行masm吗?
【发布时间】:2016-11-01 10:56:42
【问题描述】:

听起来像一个愚蠢的问题,但我不知道该怎么问:我正在尝试制作一个 python 库来测试CPUID 代码并返回结果,这恰好适用于 linux 和 windows .我能想到有效地执行 CPUID 的唯一方法是在汇编程序中对其进行编程,因此,话虽如此,是否有一种方法可以测试在独立于操作系统的机器上运行的程序的成功或失败并将其构建成python extensible library 或者,更确切地说,一种构建独立于操作系统的 python 库的方法?

Python 文档并不清楚这应该/将如何工作。我需要制作两个库,一个windows和一个linux(我只是为了效率而尝试一个)?

【问题讨论】:

  • 也许使用inline assembler
  • Can't,问题是 Windows 为其编译器使用专有语言。我需要 windows 库,但我对 windows 程序集了解不多,无法做到这一点。 (注意内联位于 Visual Studio '15 标题下)
  • @Fred Larson 只需要一些关于交叉编译的帮助/知识/启示
  • 您需要为 Windows 和 Linux 制作单独的 Python 扩展模块。但是,您可以从相同的源构建它们。我会对源代码进行条件化(例如使用#ifdef),以便在Windows 上使用__cpuid 内在函数和Visual C++ 编译器,以及在Linux 上使用GCC 或Clang 的GNU 样式内联汇编器。
  • @RossRidge 好吧,我担心这就是答案(悲伤的熊猫)。代码已经为此编写了。谢谢你:)

标签: python assembly nasm masm


【解决方案1】:

由于我没有代表写评论,所以我必须做出回答。

您不能拥有“一个(动态)库来统治它们”的原因是,Windows 和 Linux 将动态库文件(.dll、.so)视为可执行格式。 Windows 动态库具有 PE​​ 标头,Linux 无法执行,反之亦然,Linux 共享库必须具有 ELF 标头,Windows 无法执行。您的代码是否 100% 独立于平台并不重要。

至于静态库,应该可以制作一个可被 Windows 和 Linux 翻译的库。如果做不到这一点,您可以将独立于平台的“lib”组装成通用格式,例如 COFF 或 BIN,并将其链接到您当前使用的平台上。甚至可能使用某种形式的运行时链接。

很抱歉,我使用了答案部分,但没有提供具体信息。但是,如果您只是对在 Linux 和 Windows 上创建一个将内联到您的代码中的静态库感兴趣,那应该是可能的。

编辑: 在做了一些研究后我发现,不可能使用 MASM 来组装一个平面二进制文件。显然,制作一个是违反 EULA 的吗?不管前面描述的使用通用格式的过程,都不能与 MASM 一起使用,因为它会生成 PE/COFF 作为“最低级别”的目标文件。

所以解决方案可能是; 1) 将您的程序集移植到诸如 NASM(网络汇编器)之类的东西上,它可以生成平面二进制文件。

2) 剥离 PE 头以提取平面二进制文件,使用 QuasarDonkey 的 VERY INVOLVED 方法:https://stackoverflow.com/a/26877436/6509761

无论您如何获得平面二进制文件,都必须这样做;

在 Linux 上:将平面二进制文件链接为 ELF 可执行文件,应该非常简单。

平面二进制 -> ELF 可执行文件

在 Windows 上:将 PE/COFF 标头添加到平面二进制文件中,并将其链接到 .exe/.dll 文件中。微软几乎已经锁定了这个过程。我找不到任何关于如何做到这一点的例子。但理论上这个过程应该是这样的。

平面二进制 --> PE/COFF -> WINDOWS 可执行文件

QuasarDonkey 的方法可能是确定的选项(这就是我包含它的原因),但我绝不会推荐它。

真的,唯一直接的选择是为 Windows 编译一个库,为 Linux 编译一个库,使用 MASMs PE/COFF 格式作为基础是不切实际的:)

【讨论】:

  • 是的,Linux 动态链接的又名共享库是 ELF "shared objects",因此是 .so 文件名。术语:您所说的“原始二进制文件”通常称为“平面”二进制文件。但是,是的,NASM 的.bin 输出格式将机器代码组装到没有标题的输出文件中。
  • 就 OP 实际应该做的而言:使用 NASM 或 AT&T (GNU) 语法,使用汇编器宏来检测 Windows 与非 Windows,并选择正确的函数序言以匹配调用约定。拥有一个 asm 源文件应该不会太难,您可以从中生成 Windows DLL 或 Linux 共享库,而无需像没有符号的平面二进制文件那样进行任何废话(如果有多个函数,这是一个问题,或任何非立即数。)
  • 我已经用您在第一篇文章中提供的信息更新了我的答案。
  • @Peter Cordes 我不知道这是否可行,我认为如果您尝试制作由 python 对象调用的外部二进制文件,您会收到段错误。当涉及到 python 扩展时,您会遇到奇怪的错误并使用类似的“事物”编译问题。
  • 您建议 OP 使用便携式汇编程序,我完全同意。 NASM 有一些项目,它们使用宏来生成 PE:forum.nasm.us/index.php?topic=2117.0。但是,我更专注于回答 OP 的概念,即拥有“一个库来统治所有这些”,就像在一个编译库中一样,它可以在 Windows 和 Linux 空间中使用 MASM。这是不切实际的,因为 PE/COFF 要求前两个字节为 'M' 'Z',而 ELF 要求前四个字节为 '\x7f' 'E' 'L' 'F'。你根本不能两者兼得。所以我提供了一个不切实际且绝对不理智的解决方案。
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多