在这个答案Segmentation fault on printf - NASM 64bit Linux中,第一位作者说,当我分配堆栈时,%rsp必须保持16加8的倍数,因为此后函数调用将把地址压入堆栈,但是在ABI中,它说rsp必须为倍数程序入口中的16,并且当我真正尝试时,即使后来我调用printf @ PLT时,保持rsp 16的倍数加8也会导致分段错误,但是保持16的倍数有效,所以分配时我应该对rsp做什么堆栈?
答案 0 :(得分:2)
但是在ABI中,它说rsp必须是程序输入中16的倍数
_start
不是一个函数。它没有call
,任何堆栈都没有返回地址(仅argc
和实际的{ {1}}和argv[]
数组)。
是的,在 process 条目中,RSP已经16字节对齐,可以进行函数调用了。
针对您链接的问题,我再次编辑了杰斯特的答案,以澄清该问题。
必须在envp[]
前 16字节对齐。回到函数之前,函数内的偏移量为call
,包括另一个16 * n + 8
es。