当我拆卸我的小功能时,我碰巧看到了这个电话
call 0xf60d2f47 <__i686.get_pc_thunk.bx>.
我不知道为什么我需要在我的程序中调用此函数。任何解释都会有所帮助。
答案 0 :(得分:44)
此调用用于x86上与位置无关的代码。它将代码的位置加载到%ebx
寄存器中,该寄存器允许全局对象(具有与代码固定的偏移量)作为该寄存器的偏移量进行访问。
与位置无关的代码是可以在不同地址加载和执行,未经修改的代码。对于将链接到共享库的代码很重要,因为这些代码可以映射到不同进程中的不同地址。
请注意,x86-64上的等效调用不,因为该架构具有IP相对寻址模式(也就是说,它可以直接将内存位置作为与位置的偏移量来定位当前的指示)。
答案 1 :(得分:7)
通过示例添加更多信息:
假设你在函数启动时对gdb进行了解除,那么你会发现类似这样的东西:
0x012c17a3 <startup+7>: call 0x12b2ce7 <__i686.get_pc_thunk.bx>
0x012c17a8 <startup+12>: add $0x10d6518,%ebx
然后在调用__i686.get_pc_thunk.bx之后,寄存器ebx将填充值 0x012c17a8 ,这是下一条指令的地址。
您可以将该函数读作get_pc(程序计数器)。
我发现这篇文章非常适合更好地理解:
https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html