C 在处理Aleph One文章时,64位系统上缺少堆栈分配

C 在处理Aleph One文章时,64位系统上缺少堆栈分配,c,assembly,stack-smash,red-zone,C,Assembly,Stack Smash,Red Zone,我一直在搞砸Aleph One的“为了乐趣和利润而粉碎堆栈”,发现在为我的64位处理器编译代码时,堆栈内存没有使用通常的“sub$VALUE,%REG.”分配 这是函数源代码: void function() { char buffer1[5]; char buffer2[10]; int *ret; ret = buffer1 + 32; (*ret) +=8; } 这是编译版本 function: .LFB0: .cfi_startproc pushq %r

我一直在搞砸Aleph One的“为了乐趣和利润而粉碎堆栈”,发现在为我的64位处理器编译代码时,堆栈内存没有使用通常的“sub$VALUE,%REG.”分配

这是函数源代码:

void function() {
  char buffer1[5];
  char buffer2[10];
  int *ret;

  ret = buffer1 + 32;
  (*ret) +=8;   
}
这是编译版本

function:
.LFB0:
.cfi_startproc
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq    %rsp, %rbp
.cfi_def_cfa_register 6
movl    $1868654947, -16(%rbp)
movb    $0, -12(%rbp)
leaq    -16(%rbp), %rax
addq    $32, %rax
movq    %rax, -8(%rbp)
movq    -8(%rbp), %rax
movl    (%rax), %eax
leal    8(%rax), %edx
movq    -8(%rbp), %rax
movl    %edx, (%rax)
nop
popq    %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc

如果在gcc中使用-m32选项,为什么没有标准的堆栈分配?

amd64 SysV ABI包含一个称为的概念。红色区域是堆栈指针正下方128字节的区域。它的目的是允许函数分配少量堆栈,而不必减少堆栈指针。这就是为什么没有看到堆栈指针递减的原因

使用
-mno红色区域编译以关闭此功能