gpt4 book ai didi

在没有原型(prototype)的情况下将 C 地址作为函数调用

转载 作者:太空狗 更新时间:2023-10-29 15:07:17 25 4
gpt4 key购买 nike

我需要通过知道它的地址而不需要任何信息来调用 C 中的函数在它的原型(prototype)上(我不能将它转换为 C 函数指针)。

我得到的关于这个函数的信息是它的地址。

我也知道我想传递给它的参数(多亏了一个空指针)和参数数组的大小(通过 void 指针访问)。

我还想遵守 C 调用约定。对于 x86 版本,我几乎知道怎么做了(分配栈空间,复制参数到那个空间,最后调用函数)。

问题在于 x64 约定(目前是 Linux 约定),其中参数是通过寄存器。我不知道要填充的每个参数的大小适当的注册,我只知道参数数组的大小。

此外,我不想依赖 gcc,所以我不能使用 __builtin_apply 似乎不标准,也很暗。

我想自己写一段代码来支持多编译器学习有趣的东西。

所以基本上,我想编写的函数与__builtin_apply 是:

void *call_ptr(void (*fun)(), void *params, size_t size);

我还想要用 C 语言(多亏了 asm inline)或纯 x64 asm 编写的代码。

那么有没有一种方法可以正确地做到这一点并且尊重调用惯例 ?或者在不知道的情况下,这对于 x64 约定是不可能的正是调用函数的原型(prototype)?

最佳答案

特别是对于 Linux 上的 x64 调用约定,这根本不起作用。

原因是非常复杂的调用约定。

一些例子:

void funcA(float64 x);
void funcB(int64 x);

在这两种情况下,值“x”传递给函数的方式不同,因为 float 和整数传递给不同寄存器中的函数。

void funcC(float64 x,int64 y);
void funcD(int64 y,float64 x);

在这两种情况下,参数“x”和“y”的顺序不同。然而,它们以相同的方式传递给函数(两个函数对“x”使用相同的寄存器,对“y”使用相同的寄存器)。

结论:要创建一个执行您想要的操作的函数,您必须将包含每个参数的参数类型的字符串传递给汇编程序函数。参数的数量/大小肯定是不够的。然而,这绝对是可能的 - 只要它必须只能在 Linux 上工作。

关于在没有原型(prototype)的情况下将 C 地址作为函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com