Thunk技术

本文介绍了Thunk技术,通常用于在程序中构造可执行代码,特别是在处理回调函数时,当类成员函数不能直接作为回调使用时。通过Thunk,可以在调用函数之前准备this指针并调用成员函数。文章详细讲解了如何使用Thunk模板和替换占位数的技巧,以解决回调函数中缺少this指针的问题,并给出了Windows环境下回调函数的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,这是编译器的任务)。《深度探索C++对象模型》中对这个词的来源有过考证(在中文版的162页),说thunk是knuth的倒拼字。knuth就是大名鼎鼎的计算机经典名著《The Art of Computer Programming》的作者,该书被程序员们称为“编程圣经”,与牛顿的“自然哲学的数学原理”等一起,被评为“世界历史上最伟大的十种科学著作”之一(也不知是谁评的,我没查到,不过反正这本书很牛就是了)。
  一般情况下,使用thunk技术都是事先查好指令的机器码,然后将数组或结构体赋值为这些机器码的二进制值,最后再跳转到数组或结构体的首地址。比如在参考文献[1]中的代码:

void foo(int a)
{ printf ("In foo, a = %d\n", a); }

unsigned char code[9];
* ((DWORD *) &code[0]) = 0x042444FF; /* inc dword ptr [esp+4] */
              code[4]  = 0xe9;       /* JMP */
* ((DWORD *) &code[5]) = (DWORD) &foo - (DWORD) &code[0] - 9; /* 跳转偏移量 */

void (*pf)(int/* a*/) = (void (*)(int)) &code[0];
pf (6);

 

  这是一段典型的thunk代码,其执行结果是“In foo, a = 7”。
可以看到,它定义了一个数组code[9],然后将事先查好的各汇编指令的机器码直接赋值给数组。然后定义一个函数指针等于数组的首地址,最后通过该函数指针调用thunk代码。这里使用了函数指针完成调用,好处是代码比较清晰易读。也可以使用汇编代码jmp或call来完成,这样就不必额外定义一个函数指针。
  网络上的thunk代码,基本上都是这个思路。如果你实际写一段这样的代码,一定会发现很麻烦。对着教科书查找每一个汇编

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值