You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译目标文件中为何用[rip+0x0]指向全局变量?

关于GCC编译目标文件中RIP相对寻址与重定位的疑问

我是编译器新手,正在尝试理解编译器生成的代码逻辑,先写了一段简单的C代码:

// main.c
int b = 7;

int main(){
    int a = 5 + b;
    return 0;
}

用GCC 13.2执行命令 gcc -g -c -o main.o main.c 编译成目标文件,再通过 objdump -M intel -d main.o 反汇编,结果里第8行的 mov eax,DWORD PTR [rip+0x0] 让我很困惑。我知道RIP寄存器是指令指针,指向的是下一条指令,那这段代码看起来像是加载[rip+0x0]地址的值,但下一条指令显然不是我要的全局变量b的值。

我明白链接之后地址会被修正(已经执行 gcc -o final main.o 完成链接,链接后这个地址指向.data段的实际值,逻辑是通顺的),但就是搞不懂目标文件里这段代码的含义。我也在Compiler Explorer里验证过这个现象,开启"Link to Binary"并使用 -c 选项能得到同样的结果。

后来按照建议用 objdump -drwC -Mintel 反汇编了一段扩展示例代码:

int b = 7;
int c = 3;

int main(){
    int a = 5 + b;
    int d = 6 + c;
    return 0;
}

得到的反汇编结果里,全局变量b和c都是通过 [rip+0x0] 寻址的,对应的重定位项分别是R_X86_64_PC32 b-0x4和R_X86_64_PC32 c-0x4,我还是搞不清楚 [rip+0x0] 的含义,也不明白为什么会出现这种情况。


内容的提问来源于stack exchange,提问作者kunquan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:25