typedef double (*PTRFUN)(int);
PTRFUN pFun;
double glFun(int a){ return a*2.4;}
int main()
{
pFun = &glFun;
(pFun)(2);
(*pFun)(2);
(glFun)(2);
(&glFun)(2);
}
main 函数中的几行 汇编对应如下
mov QWORD PTR [rip+0x2ef7],0x401102 # 404030 <pFun>
mov rax,QWORD PTR [rip+0x2ef0] # 404030 <pFun>
mov edi,0x2
call rax
mov rax,QWORD PTR [rip+0x2ee2] # 404030 <pFun>
mov edi,0x2
call rax
mov edi,0x2
call 401102 <glFun(int)>
mov edi,0x2
call 401102 <glFun(int)>
可以看出,使用函数名glFun和函数名自身的指针glFun,或者是指向函数名的指针,pFun或者Pfun都没有问题。编译器都会自动地将函数调用转为函数指针的调用。
而因为RIP是指向指令的地址。因此随着RIP的执行,调用pFun,这个全局指针变量的偏移也会逐渐减小。