setcontext和makecontext来调用泛型函数指针

时间:2010-03-26 00:24:56

标签: c++ c assembly 32bit-64bit

another question我遇到了移植代码的问题

unsigned long stack[] = { 1, 23, 33, 43 };

/* save all the registers and the stack pointer */
unsigned long esp;
asm __volatile__ ( "pusha" );
asm __volatile__ ( "mov %%esp, %0" :"=m" (esp));

for( i = 0; i < sizeof(stack); i++ ){
    unsigned long val = stack[i];
    asm __volatile__ ( "push %0" :: "m"(val) );
}

unsigned long ret = function_pointer();

/* restore registers and stack pointer */
asm __volatile__ ( "mov %0, %%esp" :: "m" (esp) );
asm __volatile__ ( "popa" );

对于64位平台而且很多人告诉我应该使用setcontext和makecontext函数来代替,因为32位和64位之间的调用转换差异和可移植性问题。

好吧,我在网上找不到任何有用的文档,或者至少不是我需要实现的那种,所以,我怎样才能使用这些函数将参数推送到堆栈,调用泛型函数指针,获取返回值然后恢复寄存器?

2 个答案:

答案 0 :(得分:1)

最后我使用的是libffi。

答案 1 :(得分:0)

维基百科页面有一个不错的example

这不是您正在寻找的解决方案。 makecontext不接受数组而是接受变量参数列表。因此,为了调用它,您需要一个函数将数组转换为参数列表。由于这是您想要的makecontext,所以当您使用它时,您已经解决了问题。

我不知道解决方案是什么,但这是一个死胡同。