Nat*_*nts 0 python assembly masm nasm
听起来像一个愚蠢的问题,但我不知道如何问它:我正在尝试创建一个python库来测试CPUID代码并返回一个结果,这恰好适用于linux和windows.能够有效地执行CPUID的唯一方法是在汇编程序中对其进行编程,因此,有了这样的方法,可以用来测试在独立于OS的机器上运行的程序的成功或失败,并将其构建为python 可扩展库,或者更确切地说,构建一个独立于操作系统的独立python库的方法?
Python文档不清楚这将如何/将如何工作.我是否需要制作两个库,一个窗口和一个linux(我只是为了效率而尝试一个)?
小智 5
由于我没有代表写评论,我将不得不回答.
你不能拥有"一个(动态)库来统治它们"的原因是因为Windows和Linux认为动态lib文件(.dll,.so)是可执行格式.Windows动态库具有PE头,Linux无法执行,反之亦然,Linux共享库必须具有Windows无法执行的ELF头.您的代码是否100%独立于平台无关紧要.
对于静态库,应该可以制作一个可由Windows和Linux翻译的库.如果做不到这一点,您可以将平台独立的"lib"组装成COFF或BIN等通用格式,并将其链接到您当前使用的平台上.甚至可能使用某种形式的运行时链接.
对不起,我使用了答案部分,没有提供具体细节.但是,如果您只是想在Linux和Windows上创建一个静态库(将在您的代码中内联),那么它应该是可能的.
编辑:经过一些研究后我发现,不可能使用MASM来组装平面二进制文件.显然,制作一个EULA是违反EULA的?无论先前使用通用格式描述的过程如何,都不能与MASM一起使用,因为它将PE/COFF生成为"最低级别"对象文件.
所以解决方案可能是; 1)将你的程序集移植到像NASM(netwide汇编程序)这样的东西,它可以产生扁平的二进制文件.
2)使用QuasarDonkey的VERY INVOLVED方法剥离PE头以提取平面二进制文件:https://stackoverflow.com/a/26877436/6509761
无论你如何获得扁平二进制文件,你都必须这样做;
在Linux上:将平面二进制文件链接为ELF可执行文件,应该非常简单.
FLAT BINARY - > ELF EXECUTABLE
在Windows上:将PE/COFF标头添加到平面二进制文件,并将其链接到.exe/.dll文件.几乎在解锁时,微软就拥有了这个过程.我找不到任何关于如何做到这一点的例子.但理论上,这个过程看起来像这样.
FLAT BINARY - > PE/COFF - > WINDOWS EXECUTABLE
QuasarDonkey的方法可能是确定的选项(这就是我加入它的原因),但我永远不会推荐它.
真的,唯一直接的选择是为Windows编译一个库,为Linux编译一个,这使用MASMs PE/COFF格式作为基础是不切实际的:)