Gcc 编译器如何选择哪个";获取“pc”thunk“;获取当前地址的函数?

Gcc 编译器如何选择哪个";获取“pc”thunk“;获取当前地址的函数?,gcc,assembly,x86,register-allocation,position-independent-code,Gcc,Assembly,X86,Register Allocation,Position Independent Code,饼图二进制使用函数\uuux86。获取\uPC\uThunk以获取加载时动态定义的地址 i) 有时它会调用\uux86.get\upc\uthunk.ax 5ff: e8 24 00 00 00 call 628 <__x86.get_pc_thunk.ax> 604: 05 fc 19 00 00 add $0x19fc,%eax 609: 83 ec 0c sub $0xc,%esp

饼图二进制使用函数
\uuux86。获取\uPC\uThunk
以获取加载时动态定义的地址


i) 有时它会调用
\uux86.get\upc\uthunk.ax

5ff:   e8 24 00 00 00          call   628 <__x86.get_pc_thunk.ax>
604:   05 fc 19 00 00          add    $0x19fc,%eax
609:   83 ec 0c                sub    $0xc,%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>
634:   e8 87 fe ff ff          call   4c0  <__x86.get_pc_thunk.bx>
639:   81 c3 c7 19 00 00       add    $0x19c7,%ebx
63f:   83 ec 0c                sub    $0xc,%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)有时它调用
\uuux86.get\pc\uthunk.cx
或有时调用
\uuux86.get\pc\uthunk.dx



我知道
\uuux86.get\u pc\u thunk.bx
\uuux86.get\u pc\u thunk.ax
之间的区别是寄存器,它将返回地址存储在
.bx
EBX
.ax
EAX

5ff:   e8 24 00 00 00          call   628 <__x86.get_pc_thunk.ax>
604:   05 fc 19 00 00          add    $0x19fc,%eax
609:   83 ec 0c                sub    $0xc,%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>
634:   e8 87 fe ff ff          call   4c0  <__x86.get_pc_thunk.bx>
639:   81 c3 c7 19 00 00       add    $0x19c7,%ebx
63f:   83 ec 0c                sub    $0xc,%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>

那么,我的问题是:

编译器如何在
\uux86.get\pc\u thunk.ax
/
\uux86.get\pc\u thunk.bx
/
\ux86.get\pc\u thunk.cx
/
\ux86.get\pc\u thunk.dx
中选择要使用的函数

它是在编译时真正随机选择的吗?
或者有什么算法可以选择它吗?


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

我明白了。。谢谢你的回答。