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

标签 c assembly shared-libraries glibc

在反汇编我的小函数的时候,正好看到了这个调用

call   0xf60d2f47 <__i686.get_pc_thunk.bx>.

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

最佳答案

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

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

请注意,在 x86-64 上不需要等效调用,因为该架构具有 IP 相对寻址模式(也就是说,它可以直接将内存位置寻址为与当前指令)。

关于c - 什么是 __i686.get_pc_thunk.bx?为什么我们需要这个电话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679846/

相关文章:

c - 预期 ';' 在 'static' 错误之前出现,仅在使用 gcc 编译时发生在 ubuntu 而不是 windows

assembly - 基准测试错误,组装令人费解

java - 创建 MIPS 汇编器

c++ - 释放我的 *.so 文件时应该使用哪个版本的 glibc?

c - 替代 LD_PRELOAD 或 LD_LIBRARY_PATH

c - 使用 argv[] 时我的代码不接受命令行参数

c - 了解文件截断

c - C 中的共享库和二进制文件

c - Socket 程序演示网络中的链路层通信,无需使用 IP 地址

c - 优化此C(AVR)代码