当在 asm 中分配堆栈时,我应该为 %rsp 维护什么大小,16 的倍数或 16 的倍数加 8

What size should I maintain for %rsp when alloc stack in asm, multiple of 16 or multiple of 16 plus 8

在这个答案中 Segmentation fault on printf - NASM 64bit Linux 第一作者说当我分配堆栈时 %rsp 必须保持 16 加 8 的倍数因为之后函数调用会将地址压入堆栈,但在 ABI 中,它说 rsp 必须在程序入口中是 16 的倍数,当我真正尝试时,我发现 keep rsp 16 的倍数加 8 导致分段错误,即使之后我调用 printf@PLT,但是 Keep it multiple of 16 works,那么我应该为 rsp 做什么什么时候分配堆栈?

But In ABI ,it says rsp must be multiple of 16 in program entry

_start 不是函数。 它不是 call 任何东西,堆栈上没有 return 地址(只是argc 和实际的 argv[]envp[] 数组)。

是的,在 process 入口 RSP 已经 16 字节对齐,准备好调用函数。


我再次编辑了 Jester 对你链接的问题的回答以澄清它。

16 字节对齐 before a call 是要求。在另一个调用之前,您可以在函数内部使用 16 * n + 8 的偏移量返回到该函数,包括任何 pushes.