Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
假设AMD64调用约定是标准的,Windows和Linux是否可以共享代码?_Linux_Assembly_Compiler Construction_X86_X86 64 - Fatal编程技术网

假设AMD64调用约定是标准的,Windows和Linux是否可以共享代码?

假设AMD64调用约定是标准的,Windows和Linux是否可以共享代码?,linux,assembly,compiler-construction,x86,x86-64,Linux,Assembly,Compiler Construction,X86,X86 64,AMD64在Linux和Windows上有不同的调用约定,但是想象一下,如果它们是相同的,那么它们之间有可能共享代码吗 我知道COFF和ELF之间有区别,像共享库之类的东西是不同的(GOT和Windows所做的任何事情),函数名当然也不同 如果没有这一切,这可能吗?例如,ARM在Windows和Linux上具有相同的约定。是。调用约定定义了参数如何存储在堆栈/寄存器中,返回值如何处理等。如果它们相等,代码可以共享,甚至以二进制形式共享 但是,代码不得与特定平台有任何依赖关系。例如,代码不能对IO

AMD64在Linux和Windows上有不同的调用约定,但是想象一下,如果它们是相同的,那么它们之间有可能共享代码吗

我知道COFF和ELF之间有区别,像共享库之类的东西是不同的(GOT和Windows所做的任何事情),函数名当然也不同


如果没有这一切,这可能吗?例如,ARM在Windows和Linux上具有相同的约定。

是。调用约定定义了参数如何存储在堆栈/寄存器中,返回值如何处理等。如果它们相等,代码可以共享,甚至以二进制形式共享


但是,代码不得与特定平台有任何依赖关系。例如,代码不能对IO使用系统调用,但可能会为此使用特定于平台的库。

可能是特制库中的编解码器

但是,某些特定于操作系统的入口代码中的任何二进制(库或可执行文件)链接,以及当它执行一些非琐碎的操作(如再次执行纯流处理编解码器)时,它与操作系统接口。这些将是不同的

出于同样的原因,不可能在Linux上运行BSD二进制文件(与错误的注释相反)。BSD系统调用不同,对二进制文件(csu/crt*)的参数处理不同,一些系统调用是内联的


人们对POSIXAPI的相似性很着迷,但忘记了POSIX是一个源代码而不是二进制约定。

取决于“共享代码”的含义。可以相对轻松地共享相同的C/C++源代码,但由于可执行文件格式不同,它们很难共享二进制代码。共享相同程序集源代码的难度介于两者之间。即使使用不同的标准约定,只要不需要与其他代码进行互操作,您也可以使用自己的代码。如果Windows和Linux更相似,那么它们就不是Windows和Linux了。很难知道你愿意把这些假设延伸到什么程度,但很明显,它们是假设的,或者说是相反事实的。如果您的问题是如果两个操作系统足够相似,您是否可以在它们之间共享二进制文件,那么是的:如果它们不依赖标准库的扩展,那么可以在Linux上运行一些BSD二进制文件,反之亦然。