gcc - 编译器如何选择哪个 "get_pc_thunk"函数来获取当前地址?

标签 gcc assembly x86 register-allocation position-independent-code

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    $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>


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    $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) 有时它会调用 __x86.get_pc_thunk.cx 或有时 __x86.get_pc_thunk.dx



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


那么,我的问题是:

编译器如何在__x86.get_pc_thunk.ax/__x86.get_pc_thunk.bx/__x86.get_pc_thunk.cx/中选择使用哪个函数__x86.get_pc_thunk.dx

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

最佳答案

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

关于gcc - 编译器如何选择哪个 "get_pc_thunk"函数来获取当前地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860970/

相关文章:

linux - 跳转指令不起作用

c - About Variable-Size Stack Frames,关于栈帧的对齐,来自CSAPP的一个例子

用汇编函数编译 C 程序,反之亦然

c++ - 如果我按值从函数返回一个 STL 容器,GCC 会单独复制所有元素吗?

c - IBM 示例代码,不可重入函数在我的系统中不起作用

linux - copy_to_user 和 copy_from_user 结构

c - 将匿名参数传递给 C 中的函数

assembly - 如何将较小的值弹出到寄存器中

c - 我在汇编中处理一个可能的数组,但我无法弄清楚起始值是多少

ubuntu - 程序集 8086 - 从键盘读取一个值并将其与另一个值进行比较