Gcc x64函数调用

Gcc x64 function calling

本文关键字:函数调用 x64 Gcc      更新时间:2023-10-16

据我所知,x64代码有两种可能的调用约定——Microsoft x64AMD64

现在,gcc可以用-mregparm=0参数启动,如果我们使用AMD64调用约定,这将不起作用。这是因为AMD64约定强制使用前6个变量的寄存器(我真的不确定为什么这样做,但我怀疑它的实现可能是由于堆栈安全问题)。

那么,问题来了:

Microsoft x64约定下使用gcc编译时,是否有像这样的严格规则(强制寄存器使用) ?而且,如果是的话,如何在不破坏ABI兼容性的情况下绕过它们?

我不知道Microsoft Windows(也从未使用过),所以我可能无法回答你的问题。

然而,AMD64应用程序二进制接口调用约定(在Linux和其他unix上)在AMD64 ABI规范中有文档记录(也许您还应该找到并阅读微软调用约定的等效文档)。我相信他们使用寄存器来处理前6个参数是出于性能考虑(通过寄存器传递值比在堆栈上传递值快),而不是出于安全考虑。

无论你使用什么c++编译器,你都希望它遵循一些调用约定,而这些实际上是由系统决定的(因为你希望能够从你的代码中调用系统库)。所以如果你破坏了它们,你就破坏了ABI的兼容性。

但是我猜不出你为什么问这样的问题。您是否正在开发具有自己调用约定的编译器?如果是,您仍然应该有一些调用C库的方法,这要求调用外部C库时遵循控制它们的ABI约定。查看Ocaml编译器的示例。

我不认为您可以绕过这些而不破坏ABI。函数调用以及它如何影响寄存器等是平台ABI的基本组成部分。

由于函数调用ABI不匹配,您的程序可能无法在Windows x64上运行。

所有你想要的文档,请看这个MSDN链接