Gcc x64函数调用

时间:2011-10-26 12:57:06

标签: c++ gcc 64-bit convention abi

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

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

所以,问题是:

gcc约定下使用Microsoft x64进行编译时,是否存在一些严格的规则,例如(强制注册用法)?并且,如果是的话,如何在不破坏ABI兼容性的情况下绕过它们?

2 个答案:

答案 0 :(得分:3)

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

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

有关您可能需要的所有文档,请参阅this MSDN link

答案 1 :(得分:3)

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

但是,AMD64 ABI spec中记录了AMD64应用程序二进制接口调用约定(在Linux和其他Unix上)(也许您还应该找到并阅读Microsoft调用约定的等效文档)。由于性能方面的考虑,我认为他们正在为6个第一个参数使用寄存器(通过寄存器传递值比在栈上传递它们更快),而不是出于安全考虑。

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

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