查看函數,內容如下(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。