compiler select which "get_pc_thunk" function 如何获取当前地址?

how compiler select which "get_pc_thunk" function to get current address?

PIE 二进制文件使用函数 __x86.get_pc_thunk 获取加载时动态定义的地址。


i) 有时它会调用 __x86.get_pc_thunk.ax

5ff:   e8 24 00 00 00          call   628 <__x86.get_pc_thunk.ax>
604:   05 fc 19 00 00          add    [=12=]x19fc,%eax
609:   83 ec 0c                sub    [=12=]xc,%esp
60c:   8d 90 b0 e6 ff ff       lea    -0x1950(%eax),%edx
612:   52                      push   %edx
613:   89 c3                   mov    %eax,%ebx
615:   e8 36 fe ff ff          call   450 <printf@plt>


ii) 有时它会调用 __x86.get_pc_thunk.bx

634:   e8 87 fe ff ff          call   4c0  <__x86.get_pc_thunk.bx>
639:   81 c3 c7 19 00 00       add    [=13=]x19c7,%ebx
63f:   83 ec 0c                sub    [=13=]xc,%esp
642:   8b 6c 24 20             mov    0x20(%esp),%ebp
646:   8d b3 f0 fe ff ff       lea    -0x110(%ebx),%esi
64c:   e8 cb fd ff ff          call   41c <_init>


iii) 有时它调用 __x86.get_pc_thunk.cx 或有时调用 __x86.get_pc_thunk.dx.



我知道 __x86.get_pc_thunk.bx__x86.get_pc_thunk.ax 之间的区别是寄存器,它存储 return 地址,.bxEBX.axEAX.


那么,我的问题是:

如何编译select__x86.get_pc_thunk.ax/__x86.get_pc_thunk.bx/__x86.get_pc_thunk.cx/__x86.get_pc_thunk.dx?

中使用哪个函数

它在编译时 select 真的是随机的吗?
或者 select 有什么算法吗?

编译器为它想要使用的任何寄存器选择合适的函数。使用哪个寄存器是编译器寄存器分配为其编译的函数的结果,通常是不可预测的。