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

Tha*_*raj 35 c assembly glibc shared-libraries

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

call   0xf60d2f47 <__i686.get_pc_thunk.bx>.
Run Code Online (Sandbox Code Playgroud)

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

caf*_*caf 51

此调用用于x86上与位置无关的代码.它将代码的位置加载到%ebx寄存器中,这允许全局对象(具有与代码的固定偏移量)作为来自该寄存器的偏移量进行访问.

与位置无关的代码是可以在不同地址加载和执行(未修改)的代码.对于将链接到共享库的代码很重要,因为这些代码可以映射到不同进程中的不同地址.

需要注意的是等效的呼叫被需要在x86-64的,因为这架构具有IP相关的寻址模式(即,它可以直接寻址的存储器位置作为从当前指令的位置偏移).

  • 我同意,是否有任何好的链接可以获得更多信息? (2认同)

Rit*_*esh 9

通过示例添加更多信息:

假设你在函数启动时对gdb进行了解除,那么你会发现这样的事情:

0x012c17a3  <startup+7>:     call   0x12b2ce7 <__i686.get_pc_thunk.bx>
0x012c17a8 <startup+12>:     add    $0x10d6518,%ebx
Run Code Online (Sandbox Code Playgroud)

然后在调用__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