WSL Ubuntu运行x86 NASM汇编程序遇执行格式错误及段错误
问题描述
主操作系统为Windows 10,已安装WSL Ubuntu环境,系统信息:
Linux DESKTOP-AHS9L1H 4.4.0-19041-Microsoft #3570-Microsoft Fri Sep 29 17:00:00 PST 2023 x86_64 x86_64 x86_64 GNU/Linux
尝试运行x86 NASM汇编程序asem.asm,代码如下:
section .data section .text global _start _start: MOV eax, 1 MOV ebx, 1 INT 80h
执行32位编译命令:
nasm -f elf -o asem.o asem.asm ld -m elf_i386 -o asem asem.o ./asem
前两步成功生成目标文件和可执行文件,但运行时报错:
-bash: ./asem: cannot execute binary file: Exec format error
尝试64位编译命令:
nasm -f elf64 asem.asm -o asem.o ld -o asem asem.o -m elf_x86_64 ./asem
运行时报错:
Segmentation fault (core dumped)
原因分析
- 32位程序执行失败:你的WSL环境是64位(x86_64),默认未安装32位程序运行依赖库,且WSL 1对32位程序兼容性有限,导致无法执行32位二进制文件。
- 64位编译段错误:原代码使用32位Linux系统调用方式(
INT 80h),但64位Linux系统调用需用syscall指令,且寄存器、系统调用号规则完全不同,直接套用32位逻辑会触发段错误。
解决方法
方法一:启用32位程序支持(适配原32位代码)
- 安装32位运行依赖库:
sudo apt update && sudo apt install gcc-multilib libc6-i386
- 重新编译并运行原代码:
nasm -f elf -o asem.o asem.asm ld -m elf_i386 -o asem asem.o ./asem
注:WSL 1下可能仍存在兼容性问题,若此方法无效,建议改用方法二或升级到WSL 2。
方法二:修改为64位汇编代码(推荐)
将原代码改为符合64位Linux系统调用规范的版本:
section .data section .text global _start _start: mov rax, 60 ; 64位Linux系统调用号:exit=60 mov rdi, 1 ; 退出码=1 syscall ; 触发系统调用
编译并运行:
nasm -f elf64 asem.asm -o asem.o ld -o asem asem.o ./asem
运行后可通过echo $?查看退出码,输出为1即说明程序执行成功。
内容的提问来源于stack exchange,提问作者Fire Waffle
相关产品推荐
相关产品推荐

