将C地址称为无原型的函数

Zer*_*kan 5 c 64-bit assembly

我需要通过知道它的地址来调用C中的函数,并且没有关于它原型的信息(我不能将它转换为C函数指针).

我对此功能的信息是地址.

我也知道我想传递给它的参数(感谢void指针)和arguments数组的大小(通过void指针访问).

我还想尊重C调用约定.对于x86版本,我几乎知道如何做(在堆栈上分配空间,将参数复制到该空间,最后调用该函数).

问题在于x64约定(现在是Linux),其中参数通过寄存器传递.我不知道每个参数的大小来填充适当的寄存器,我只知道参数数组的大小.

另外,我不想依赖gcc所以我不能使用__builtin_apply,这似乎不是标准的,也很暗.

我想编写自己的代码来支持多编译器以及学习有趣的东西.

所以基本上,我想写的函数与__builtin_apply的原型相同,即:

void *call_ptr(void (*fun)(), void *params, size_t size);
Run Code Online (Sandbox Code Playgroud)

我也希望代码用C语言编写(感谢asm inline)或纯x64 asm.

那么有没有办法正确地做到这一点并尊重调用约定?或者这是不可能的x64约定,而不知道所谓的函数的原型?

Egg*_*ead 0

我认为,你的所有决定都不会支持多编译器,因为将参数传递给函数的机制(寄存器,它们的顺序,堆栈,内存) - 这是编译器依赖功能......

  • _“这是编译器依赖功能”_。幸运的是事实并非如此。至少如果编译器遵循目标操作系统的 [ABI](http://en.wikipedia.org/wiki/Application_binary_interface) 则不会。 (3认同)