这是一个简单的程序:
void func()
{
printf("hello");
}
int main()
{
printf("%p",func);
func();
return 0;
}
越过线
printf("%p",func)
,控制台上会打印出00F811AE
。
拆卸线路
func()
,给我call _func (0F811AEh)
- 到目前为止一切顺利。
但是反汇编
func
的内容,第一条指令出现在地址00F813C0
。
所以我“去看”地址
00F811AE
上有什么,然后我发现了jmp func (0F813C0h)
。
总而言之,函数调用似乎被编译为两条指令:
call _func (0F811AEh)
jmp func (0F813C0h)
为什么VS2013编译器使用两条指令而不是一条指令?
看起来一个
jmp
就可以完成这项工作。我之所以问这个,是因为我有一种感觉,其他编译器以类似的方式执行此操作(当然取决于底层硬件架构)。
了解“thunking”:http://en.wikipedia.org/wiki/Thunk
示例中“thunking”的一个好处是,代码的其余部分将始终调用 func,但执行相同角色的任何函数都可以注入到地址 0x00F811AE 处的调用中。
尝试将 func 设为 static 并查看是否有任何变化。