x86-64 Linux堆栈错位没有seg错误

时间:2014-08-11 10:50:36

标签: linux x86-64

我正在通过Nick Desaulniers工作:Let's Write Some X86-64文件h4.s:

.text
.globl main
 main:
#  subq $8, %rsp
movq $0, %rdi
call _exit

他在Mac上运行并说运行上述操作会产生分段错误。我正在使用opensuse 13.1运行

gcc h4.s

编译和链接。调整堆栈指针或注释掉行时,我没有遇到段错误。有谁知道为什么不呢? SP是否需要与16字节边界对齐?

1 个答案:

答案 0 :(得分:2)

64位ABI要求堆栈指针在进入例程(16B与堆栈上推送的返回地址对齐)时为8个mod 16字节。硬件不需要这样,因此,如果在堆栈未正确对齐时进行调用,则不会“死”。

但是,如果堆栈未对齐,并且有人在某些时候想要做一些基于他们具有16B对齐堆栈的假设(例如,发出对齐的xmm指令,如“movdqa [esp],.. 。“,那么你可以得到实际的失败(非法指令,段错误等,取决于正在做什么)。

总结:在调用之前简单地错位堆栈不会导致立即错误,除非有人后来需要堆栈对齐。