【问题标题】:Custom X86_64 calling convention to C function call自定义 X86_64 调用约定到 C 函数调用
【发布时间】:2011-01-05 11:08:12
【问题描述】:

我必须做一个接口(比如,一个包装器),它允许使用他的调用约定从 X86_64 汇编代码调用 C 函数,以及其他调用约定。最好的事情是非常“独立于编译器”(只是修改包装器),所以我正在寻找将寄存器/堆栈的东西放在编译器上的东西。我已经看过这里:Custom calling convention for P/Invoke and C#,它离我要做的事情很近了。目前,我正在使用 GCC,但欢迎来自其他编译器的提示!

所以,这就是问题的最佳视角(自定义编码约定很奇怪):

pushq  %r11    # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11      # restores %r11 ; return value is in the structure

我需要能够调用“特殊”(包装器)C 函数;这里的工作将是在其他 C 函数之间调度调用。所以这个包装器需要找到 %r11,保存所有寄存器并准备堆栈以供进一步调用。在 C 中是否有适当的方法来执行此操作(使用一些内联 asm)?

非常感谢

【问题讨论】:

  • Visual C++ 有一个__declspec(naked) 修饰符,可以防止编译器生成序言和尾声。
  • __declspec(naked) 在为 x64 目标(以及内联汇编)进行编译时不受支持。

标签: c assembly x86-64 calling-convention libffi


【解决方案1】:

有关调用约定以及如何将参数传递给函数(在寄存器中?哪个?堆栈上的内容等)的文档,请查看Agner Fog's document

然后,您可以查看libffi 的源代码,看看他们是如何做到的。

【讨论】:

  • 感谢您的回答;我不知道 libffi,我要检查一下,听起来很棒。
  • 如果我是你,如果可能的话,我只会依赖 libffi。它稳定、维护并处理许多极端情况
  • 好的,Agner Fog 的文档很有用。但是 libffi 并没有保存所有寄存器,尤其是 YMM 寄存器(还没有?)。顺便说一句,我应该可以用它做一些事情!非常感谢。
猜你喜欢
  • 2021-12-25
  • 2011-12-03
  • 1970-01-01
  • 2023-04-03
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多