You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
原因分析
  1. 32位程序执行失败:你的WSL环境是64位(x86_64),默认未安装32位程序运行依赖库,且WSL 1对32位程序兼容性有限,导致无法执行32位二进制文件。
  2. 64位编译段错误:原代码使用32位Linux系统调用方式(INT 80h),但64位Linux系统调用需用syscall指令,且寄存器、系统调用号规则完全不同,直接套用32位逻辑会触发段错误。
解决方法

方法一:启用32位程序支持(适配原32位代码)

  1. 安装32位运行依赖库:
sudo apt update && sudo apt install gcc-multilib libc6-i386
  1. 重新编译并运行原代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:16:32