RISC-V交叉编译Linux内核能否生成ELF?QEMU -kernel是否支持?
RISC-V交叉编译内核格式与QEMU加载问题
我在进行RISC-V交叉编译Linux内核时,生成的arch/riscv/boot/Image文件为EFI格式,执行file命令结果如下:
file arch/riscv/boot/Image arch/riscv/boot/Image: MS-DOS executable PE32+ executable (EFI application) RISC-V 64-bit (stripped to external PDB), for MS Windows
而AMD64机器上的内核文件为ELF格式,file命令结果如下:
file /boot/vmlinuz-5.10.0-23-amd64 /boot/vmlinuz-5.10.0-23-amd64: Linux kernel x86 boot executable bzImage, version 5.10.0-23-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 5.10.179-1 (2023-05-12), RO-rootFS, swap_dev 0x6, Normal VGA
我已了解EFI STUB相关内容,现咨询两个问题:
- 是否可以控制RISC-V交叉编译的输出,生成ELF格式的Linux内核?
- QEMU RISC-V的
-kernel参数是否支持加载ELF格式的内核文件?
问题解答
1. 能否生成ELF格式的RISC-V Linux内核?
可以。你得到的EFI格式Image是因为编译时开启了CONFIG_EFI_STUB选项,该选项会将内核打包为EFI可执行文件。要生成纯ELF格式内核,只需关闭该选项后重新编译:
- 方法一:执行
make menuconfig,进入Firmware Drivers->EFI Support,取消勾选EFI stub support - 方法二:直接在
.config文件中设置CONFIG_EFI_STUB=n
重新编译后,arch/riscv/boot/Image会变为ELF格式,执行file命令会显示类似结果:
arch/riscv/boot/Image: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, stripped
2. QEMU RISC-V的-kernel参数是否支持ELF格式内核?
完全支持。QEMU对RISC-V的-kernel参数同时兼容ELF和EFI格式的内核镜像。在无EFI环境的QEMU虚拟机(比如使用OpenSBI作为固件的场景)中,ELF格式内核是更常用的加载方式,QEMU可直接解析ELF文件的段信息,将内核加载到正确内存地址并启动。
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

