我正在尝试编写一个程序,该程序将使用用户输入的名称,参数及其类型从动态库运行功能。我可以使用dlsym(func_name)获得指向该函数的void *指针,但是我事先不知道参数的类型及其数量,因此无法以正常方式取消对该指针的引用。
如果将所有参数的字节表示形式复制到char *数组中,我可以调用以该数组作为参数的函数吗?例如,在程序集中调用printf时,我可以将参数和格式字符串推入堆栈,然后调用printf。也许我可以在C中做类似的事情,或者使用汇编插入?
例如,假设函数为void func(int,double);我得到了int a,double b的参数。然后,我将创建一个数组:
char buf[sizeof(int) + sizeof(double)]
memcpy(buf, &a, sizeof(int))
memcpy(buf + sizeof(int), &b, sizeof(double))
并将其用作推入堆栈的参数。
没有任何计算环境都有关于如何传递参数的规范。参数的类型和大小会影响它们是否在常规寄存器,浮点寄存器或其他位置中传递,以及它们的对齐方式。很少有这样的规范将参数作为原始字节转储传递给堆栈。