将如下代码进行编译,输出的汇编版本为
int main()
{
int a[2][3]= {{1,2,3},{4,5,6}};
return 0;
}
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl %gs:20, %eax
movl %eax, -12(%ebp)
xorl %eax, %eax
movl $1, -36(%ebp)
movl $2, -32(%ebp)
movl $3, -28(%ebp)
movl $4, -24(%ebp)
movl $5, -20(%ebp)
movl $6, -16(%ebp)
movl $0, %eax
movl -12(%ebp), %edx
xorl %gs:20, %edx
je .L3
call __stack_chk_fail
其中如下两行的作用是将 %gs:20 的值放在数组结束处,并在结束的时候判断这个值有没有被改变,从而判断堆栈是否损坏。这种叫做Stack canaries, 堆栈金丝雀
movl %gs:20, %eax
xorl %gs:20, %edx
gcc 默认情况下是开启堆栈检查,即 gcc -fstack-protector=strong
可以通过 gcc -fno-stack-protector
关闭检查。
另,gs 一般 用来存放线程局部变量,比如 errno
参考: