bzImage 交叉编译 Linux 内核失败

bzImage 交叉编译 Linux 内核失败

我想从头开始为arm64(aarch64)平台编译一个Linux内核,用于启动Raspberry Pi 4。

主机是 amd64 并运行 Debian 变体 (Ubuntu 20.04.1 LTS)

我创建了以下脚本,尝试执行所有操作:

###### 构建环境 ######

# 下载并安装主机系统所需的软件包来进行编译
apt install build-essential libgmp-dev libmpfr-dev libmpc-dev libisl-dev libncurses5-dev bc git-core bison flex

# 在 RAM 中创建临时构建环境
前缀=/tmp/BE
mkdir -p ${前缀}
umount ${PREFIX} 2>&1 > /dev/null
挂载 -t tmpfs tmpfs ${PREFIX}

# 二进制实用程序:
# 从 ftp.gnu.org 下载 binutils 并编译并将其安装到主机 [redacted]
cd obj-binutils
../binutils-${BINUTILSVERSION}/configure --prefix=${PREFIX}/binutils --target=aarch64-linux-gnu --disable-nls
进行安装

# 海湾合作委员会:
# 从 ftp.gnu.org 下载 gcc 并编译并安装到主机上 [已编辑]
# 配置海湾合作委员会:
../gcc-${GCCVERSION}/configure --prefix=${PREFIX}/gcc --target=aarch64-linux-gnu \
--with-newlib --without-headers --disable-nls --disable-shared --disable-threads \
--disable-libssp --disable-decimal-float --disable-libquadmath --disable-libvtv \
--disable-libgomp --disable-libatomic --enable-languages=c
# 安装海湾合作委员会:
make all-gcc -j${线程}
进行安装-gcc
# 测试:
${PREFIX}/gcc/bin/aarch64-linux-gnu-gcc -v
# libgcc 可选 [已跳过]


###### Linux ######

# 请注意,我们从 raspberrypi linux git 下载
LINUXBRANCH="rpi-5.10.y"
mkdir -p ${PREFIX}/linux
cd ${PREFIX}/linux
git克隆--深度= 1 -b $ {LINUXBRANCH} https://github.com/raspberrypi/linux.git
mkdir 内核输出

# 将编译好的 gcc/binutils 二进制文件复制到 linux /bin 目录
光盘Linux
目录目录
mv ${PREFIX}/binutils/bin/* ${PREFIX}/linux/linux/bin/
mv ${PREFIX}/gcc/bin/* ${PREFIX}/linux/linux/bin/

# RPi4具体配置
内核=内核8
使 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu- bcm2711_defconfig

# Linux 菜单配置
使 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu- menuconfig

# Linux 构建
make -j${THREADS} O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
# 注意,产生的结果:
ls -l /tmp/BE/linux/kernel-out/vmlinux
#就我而言:
#-rwxr-xr-x 1 root root 26179040 二月 25 22:48 /tmp/BE/linux/kernel-out/vmlinux


# Linux 将 vmlinux 压缩成 bzImage
# 注意:pwd = /tmp/BE/linux/linux
使 bzImage O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
查找 ${PREFIX} -iname vmlinuz

但我目前陷入了最后一步,即从 vmlinux 创建 bzImage。显然,你不能只将 vmlinux 压缩为 vmlinuz,它需要使用make bzImage.但这会产生错误:

# 提醒:pwd = /tmp/BE/linux/linux
make[1]: 进入目录 '/tmp/BE/linux/kernel-out'
make[1]: *** 没有规则可以创建目标“bzImage”。停止。
make[1]: 离开目录 '/tmp/BE/linux/kernel-out'
make: *** [Makefile:185: __sub-make] 错误 2

欢迎对 bzImage 问题提供任何帮助,但通常我的问题是指为 ARM64 平台交叉编译 Linux 内核的整个过程。

欢迎就我在这里使用 GCC 和 binutils 做的事情是否正确提供任何建议。我确实到处遇到一些 GCC 错误。但 vmlinux 确实编译了。我想首先测试生成的 vmlinux,将其转换为 vmlinuz 并修改 Ubuntu 中的现有 SD 卡映像。

我希望编辑我的问题,以便该脚本对于其他想要为其 RPi4 或其他设备编译 ARM64 Linux 内核的人有用。

答案1

显然,编译 Linux 内核的正确过程对于每个平台都是不同的:

# 在 32 位 x86 上
制作 bzImage

# 在 64 位 x86 上
制作 zImage

# 在 64 位 ARM 上
制作图像

# 在当前目录中搜索编译好的linux内核
查找./-iname“*图像”

相关内容