什么是__i686.get_pc_thunk.bx?为什么我们需要这个电话?

时间:2011-07-13 13:40:22

标签: c assembly shared-libraries glibc

当我拆卸我的小功能时,我碰巧看到了这个电话

call   0xf60d2f47 <__i686.get_pc_thunk.bx>.

我不知道为什么我需要在我的程序中调用此函数。任何解释都会有所帮助。

2 个答案:

答案 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