在this SO线程中,Brian Postow suggested涉及伪造的匿名函数的解决方案:
如何实现这样的功能?
最佳答案
看到the answer I just posted这个问题。您可以使用 callback(3)
库在运行时生成新函数。它不符合标准,因为它涉及许多丑陋的特定于平台的黑客,但它确实可以在大量系统上工作。
该库负责分配内存,确保内存是可执行的,并在必要时刷新指令高速缓存,以确保动态生成的代码(即闭包)是可执行的。它本质上生成的代码 stub 在x86上可能看起来像这样:
pop %ecx
push $THUNK
push %ecx
jmp $function
THUNK:
.long $parameter
然后返回第一条指令的地址。该 stub 的作用是将返回地址存储到ECX(x86调用约定中的暂存寄存器)中,将一个额外的参数压入堆栈(指向thunk的指针),然后重新推送返回地址。然后,它跳转到实际功能。这导致该函数误以为它具有一个额外的参数,这是闭包的隐藏上下文。
实际上,这要复杂得多(在 stub 末尾调用的实际函数是
__vacall_r
,而不是函数本身,并且__vacall_r()
处理更多的实现细节),但这是基本原理。