为什么从 _start 返回会出现段错误?

0 assembly stack system-calls exit

我尝试将代码不放在主函数中,而是直接放入_start

    segment .text
    global _start
_start:
    push rbp
    mov rbp, rsp
    ; ... program logic ...
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

编译:

yasm -f elf64 main.s
ld -o main main.o
Run Code Online (Sandbox Code Playgroud)

跑步:

./main
Segmentation fault(core dumped)
Run Code Online (Sandbox Code Playgroud)

我读过,离开是

mov esp,ebp
pop ebp
Run Code Online (Sandbox Code Playgroud)

但是为什么弹出堆栈帧的尾声和指向前一帧基址的设置基址帧指针会导致分段错误?

事实上,进行退出系统调用可以优雅地退出。

Mar*_*oom 5

根据ABI 1,入口处的堆栈_start

_start 入口处的堆栈

没有“返回地址”。
退出进程的唯一方法是通过SYS_EXIT

xorl %edi, %edi   ;Error code
movl $60, %eax    ;SYS_EXIT
syscall
Run Code Online (Sandbox Code Playgroud)

1第 3.4.1节初始堆栈和寄存器状态