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
相关产品推荐
相关产品推荐

