GCC 和 Clang 在 32 位 x86 位置无关代码中使用这些辅助函数将当前执行地址放入寄存器,例如:
call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_, %ebx
movl $2, 4(%esp)
leal .LC0@GOTOFF(%ebx), %eax
movl %eax, (%esp)
call dlopen@PLT
似乎实现是等效的:
__x86.get_pc_thunk.bx:
movl (%esp), %ebx
ret
__i686.get_pc_thunk.bx:
movl (%esp), %ebx
ret
除了更名之外还有什么区别(似乎i686更旧)?有 i686 前缀而不是 i386 的原因吗?