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相关的寻址模式(即,它可以直接寻址的存储器位置作为从当前指令的位置偏移).
通过示例添加更多信息:
假设你在函数启动时对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