WSL2环境下yasm汇编代码编译运行出现段错误,如何排查原因?
问题原因
- 64位Linux环境下的系统调用号和32位不同:你使用elf64格式生成64位程序,
_exit系统调用的正确调用号是60,而非32位场景下的1。 - 未完成系统调用的完整流程:你仅设置了调用号寄存器的值,既没有设置
_exit需要的退出状态参数(需要存入rdi寄存器),也没有执行触发系统调用的syscall指令。 - CPU执行流失控:执行完
mov eax,1之后,没有指令让进程退出,CPU会继续读取后续内存的内容当做指令执行,这部分内存不属于程序合法的可执行地址空间,直接触发段错误。
修复后的代码
segment .text global _start _start: mov rax, 60 ; 64位Linux _exit系统调用号 mov rdi, 0 ; 退出状态码为0表示正常退出 syscall ; 触发系统调用
编译运行验证
使用你原有的编译链接命令即可正常执行,不会再触发段错误:
yasm -f elf64 -g dwarf2 -l task1.lst task1.asm ld -o task1 task1.o ./task1
执行后无输出,进程正常退出,你可以用echo $?查看退出状态码为0,符合预期。
内容的提问来源于stack exchange,提问作者NullPointer7
相关产品推荐
相关产品推荐

