编译目标文件中为何用[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
相关产品推荐
相关产品推荐

