在 Aleph One 上工作时,在 64 位系统上没有堆栈分配

Posted

技术标签:

【中文标题】在 Aleph One 上工作时,在 64 位系统上没有堆栈分配【英文标题】:Absence of stack allocation on 64-bit system while working on Aleph One article 【发布时间】:2017-02-17 21:33:20 【问题描述】:

我一直在搞乱 Aleph One 的“为乐趣和利润粉碎堆栈”,发现在为我的 64 位处理器编译代码时,堆栈内存没有使用通常的“sub $”分配值,%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 选项,为什么没有标准堆栈分配?

【问题讨论】:

【参考方案1】:

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

使用-mno-red-zone 编译以关闭此功能。

【讨论】:

以上是关于在 Aleph One 上工作时,在 64 位系统上没有堆栈分配的主要内容,如果未能解决你的问题,请参考以下文章

强制 gcc 在 64 位平台上编译 32 位程序

XboX one的无线适配器 在Win7上怎么用

在64位操作系统上,下面程序返回啥结构

32位系统上的Wow64:还原[重复]

在 64 位操作系统上,32 位进程可以访问多少内存?

Erlang crypto:stream_init在32位和64位系统上提供不同的密钥。如何使用?