我曾尝试使用gcc -S -fasm foo.c
将c代码编译为汇编代码。
该c代码声明了全局变量和主函数中的变量,如下所示:
int y=6;
int main()
{
int x=4;
x=x+y;
return 0;
}
现在我查看了从这段C代码生成的汇编代码,并且我注意到全局变量y使用rip指令指针的值来存储。
我曾以为只有const全局变量存储在文本段中,但是看了这个例子后,似乎普通的全局变量也存储在文本段中,这非常奇怪。
我猜想我做出了一些错误的假设,所以能否有人解释一下呢?
C编译器生成的汇编代码:
.file "foo.c"
.text
.globl y
.data
.align 4
.type y, @object
.size y, 4
y:
.long 6
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $4, -4(%rbp)
movl y(%rip), %eax
addl %eax, -4(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
rip
访问的,但这并不意味着它在.text
段(或部分)中。正如您在汇编代码中清楚地看到的那样,它前面有一个.data
,因此它不在.text
中,而只是一种独立于位置的访问内存的方式。由于地址空间布局随机化 (ASLR) 的普及,现在经常默认启用它。 - Jester