__x86.get_pc_thunk.ax

查看函数,内容如下(xchg %ax,%ax命令交换%ax与%ax,相当于nop):

00000559 <__x86.get_pc_thunk.ax>:
 559:  8b 04 24               mov    (%esp),%eax
 55c:  c3                     ret    
 55d:  66 90                  xchg   %ax,%ax
 55f:  90                     nop

简单来说,该函数的功能是将%eip寄存器内容传入%eax寄存器。相当于mov %eip,%eax。

这个函数在x86上的PIC(position independent code,即位置无关代码)中使用。它将%eip的位置加载到%eax寄存器中,从而实现对模块内部数据(例如全局变量)的访问。
原因是x86的指令集中没有直接读取%eip的指令。

类似的函数还有:__x86.get_pc_thunk.bx,__x86.get_pc_thunk.cx, __x86.get_pc_thunk.dx。
功能是类似的,只不过传入的寄存器分别为%ebx, %ecx, %edx。早期版本的编译器中,这个函数叫__i686.get_pc_thunk.ax。

在64位程序中不需要这个函数,因为指令集中可以直接获取%eip。

posted @ 2020-02-27 21:51  friedCoder  阅读(1322)  评论(0编辑  收藏  举报