setcontext 和 makecontext 调用通用函数指针
Posted
技术标签:
【中文标题】setcontext 和 makecontext 调用通用函数指针【英文标题】:setcontext and makecontext to call a generic function pointer 【发布时间】:2011-02-01 00:01:54 【问题描述】:在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 之间的调用转换差异位和可移植性问题。
好吧,我真的在网上找不到任何有用的文档,或者至少不是我需要实现的那种,所以,我如何使用这些函数将参数压入堆栈,调用通用函数指针,获取返回值然后恢复寄存器?
【问题讨论】:
【参考方案1】:我终于使用 libffi 了。
【讨论】:
【参考方案2】:***页面有一个不错的example。
这不是您正在寻找的解决方案。 makecontext
不采用数组,而是采用变量参数列表。因此,为了调用它,您需要一个将数组转换为参数列表的函数。既然这就是你想要的makecontext
,当你可以使用它时,你已经解决了你的问题。
我不知道解决方案是什么,但这是一条死胡同。
【讨论】:
好的,但是如何将 ulong 值插入堆栈? 好的,但问题是 makecontext 想要函数的参数,我不知道它们的数量,它们可能是 2 个参数,也可以是 4 个......以上是关于setcontext 和 makecontext 调用通用函数指针的主要内容,如果未能解决你的问题,请参考以下文章