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 地址,.bx
到 EBX
,.ax
到 EAX
.
那么,我的问题是:
如何编译select__x86.get_pc_thunk.ax
/__x86.get_pc_thunk.bx
/__x86.get_pc_thunk.cx
/__x86.get_pc_thunk.dx
?
中使用哪个函数
它在编译时 select 真的是随机的吗?
或者 select 有什么算法吗?
编译器为它想要使用的任何寄存器选择合适的函数。使用哪个寄存器是编译器寄存器分配为其编译的函数的结果,通常是不可预测的。
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 地址,.bx
到 EBX
,.ax
到 EAX
.
那么,我的问题是:
如何编译select__x86.get_pc_thunk.ax
/__x86.get_pc_thunk.bx
/__x86.get_pc_thunk.cx
/__x86.get_pc_thunk.dx
?
它在编译时 select 真的是随机的吗?
或者 select 有什么算法吗?
编译器为它想要使用的任何寄存器选择合适的函数。使用哪个寄存器是编译器寄存器分配为其编译的函数的结果,通常是不可预测的。