【发布时间】:2019-10-09 07:12:22
【问题描述】:
我尝试使用 gcc -S -fasm foo.c 将 c 代码编译为汇编代码。
c代码在main函数中声明全局变量和变量如下图:
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,它经常默认启用。
标签: c assembly compiler-construction x86-64