__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。