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

32位内核编译报错:unrecognised emulation mode: elf_i386

故障原因

两个报错同源:你用的64位Ubuntu虚拟机默认没装32位x86架构的编译、链接支持组件,所以gcc识别不了-m32生成32位代码的参数,ld也找不到elf_i386对应的32位ELF链接仿真模式。
绝对不能直接删掉-m32参数编译,否则gcc会生成64位目标文件,和nasm输出的32位kasm.o架构不匹配,就算侥幸过了链接步骤,最后生成的文件也根本没法被32位qemu引导。

修复步骤

1. 安装32位编译依赖

在Ubuntu终端执行命令:

sudo apt update
sudo apt install gcc-multilib libc6-dev-i386

装完先做两个校验:

  • 跑gcc -m32 --version,不报错、正常输出版本号就说明gcc的32位支持正常
  • 跑ld -m elf_i386 --help,不报错、正常输出帮助信息就说明ld的32位链接支持正常

2. 修复源码的函数名不匹配问题

你现有代码藏了个会触发链接报错的问题:汇编文件里声明、调用的C入口函数叫kmain,但C文件里实现的函数叫k_main,名字对不上。二选一修改即可:

  • 要么把kernel.asm里的extern kmain、call kmain都改成k_main
  • 要么把kernel.c里的void k_main()改成void kmain()

3. 重新编译构建

用下面的命令重新编译,额外加的参数是编译内核的通用配置,避免绑定主机系统的标准库、生成不符合裸机环境的可执行格式:

nasm -f elf32 kernel.asm -o kasm.o
gcc -m32 -c kernel.c -o kc.o -ffreestanding -nostdlib -fno-pie
ld -m elf_i386 -T linker.ld -o kernel kasm.o kc.o -nostdlib

4. 运行测试

编译完成后直接执行原有qemu命令即可启动:

qemu-system-i386 -kernel kernel

启动成功后会弹出qemu窗口,黑色背景上显示你在C代码里写的欢迎字符串。

内容的提问来源于stack exchange,提问作者user7289922

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:30:53