assembly - 为什么从 _start 段错误返回?

标签 assembly stack system-calls exit

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

    segment .text
    global _start
_start:
    push rbp
    mov rbp, rsp
    ; ... program logic ...
    leave
    ret

编译:

yasm -f elf64 main.s
ld -o main main.o

运行:

./main
Segmentation fault(core dumped)

我读完了,离开是

mov esp,ebp
pop ebp

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

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

最佳答案

根据 ABI 1 _start 入口处的栈是

Stack at entry on _start

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

xorl %edi, %edi   ;Error code
movl $60, %eax    ;SYS_EXIT
syscall

1 3.4.1 初始堆栈和寄存器状态部分。

关于assembly - 为什么从 _start 段错误返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553289/

相关文章:

assembly - 如何重新编程我的 shellcode 片段以避免空字节?

c - ARM 汇编器中的可变大小 int 矩阵

c++ - 递归搜索堆栈,但保持堆栈不变

java - 将字符串表达式计算为整数?

linux - 最大驻留集大小是什么意思?

linux - 执行内联汇编

c++ - 什么寄存器指向堆?

java - 支架检查器

c - 使用 fork() 获取 child 的 child

gcc - 即使它真的是.c,如何告诉GCC输入文件是汇编程序?