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()处理更多的实现细节),但这是基本原理。

09-05 23:30
查看更多