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

时间:2016-03-09 08:23:41

标签: linux assembly compiler-construction x86 x86-64

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

我知道COFF和ELF之间存在差异,共享库之类的东西是不同的(GOT与Windows不同),功能名称当然也不同。

除非这一切都有可能吗?例如,ARM在Windows和Linux上都有相同的约定。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

也许在特制的库中使用编解码器。

但是任何二进制文件(库或可执行文件)链接在某些特定于操作系统的条目代码中,并且当它执行非常简单的操作时(如再次纯粹的流处理编解码器),它会与操作系统接口。那些将是不同的。

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

人们在POSIX api模拟上喝醉了,但忘了POSIX是而不是二元约定。