在不知道参数的情况下将函数调用传递给另一个

时间:2014-06-25 20:12:23

标签: c assembly mingw

我试图简单地将控件从一个函数传递给另一个函数。例如,每次调用函数first时,我都希望使用相同的参数调用函数second

问题是:我不知道传递了多少个参数,它们的类型或返回类型。为什么?我正在尝试在Windows上使用MingW编写DLL包装器。因此,在这种情况下,first是库中的符号,second是我的函数。我知道DLL符号,但不知道它们的原型。

我认为在C中编写second并且汇编中的以下代码就足够了:

_first:
    jmp _second

或者也许:

_first:
    call _second
    ret

但是在调用first时它只会给我一个分段错误。

2 个答案:

答案 0 :(得分:2)

感谢@Deduplicator评论,这是最终有效的代码:

int first() 
{ 
    __builtin_return(
        __builtin_apply(
            (void(*)())second, __builtin_apply_args(), 512)); 
}

为什么是512?我不确定。手册说

  

计算适当的大小值并不总是很简单。 __builtin_apply使用该值来计算应该在堆栈上推送并从传入参数区域复制的数据量。

如果有人知道如何更好地估算尺寸,请告诉我并编辑答案。

答案 1 :(得分:0)

你理想的是函数,即编译器不添加模板代码(操纵堆栈帧)的函数。不幸的是,似乎没有直接支持GCC中的裸功能(在MSVC中)。好消息是,下面列出了一种虽然稍微复杂的解决方法。

http://gynvael.coldwind.pl/?id=15

您可以做的其他事情是明确保留所有寄存器值。但是,访问参数会变得稍微复杂一些,因为您必须首先查看反汇编,然后相应地更新_second以访问任何参数。

_first:
    pushad
    call _second
    popad
    ret