Linux

在 bzImage 上交叉編譯 Linux 核心失敗

  • March 8, 2021

我想為 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 ${前綴}
解除安裝 ${PREFIX} 2>&1 > /dev/null
mount -t tmpfs tmpfs ${PREFIX}

# 二進制工具:
# 從 ftp.gnu.org 下載 binutils 並編譯並安裝到主機 [已編輯]
cd obj-binutils
../binutils-${BINUTILSVERSION}/configure --prefix=${PREFIX}/binutils --target=aarch64-linux-gnu --disable-nls
進行安裝

# gcc:
# 從 ftp.gnu.org 下載 gcc 並編譯並安裝到主機 [已編輯]
# 配置 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
# 安裝 gcc:
使所有 gcc -j${執行緒}
製作安裝-gcc
# 測試:
${PREFIX}/gcc/bin/aarch64-linux-gnu-gcc -v
# libgcc 可選 [跳過]


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

# 注意我們是從 raspberrypi linux git 下載的
LINUXBRANCH="rpi-5.10.y"
mkdir -p ${前綴}/linux
cd ${前綴}/linux
git clone --depth=1 -b ${LINUXBRANCH} https://github.com/raspberrypi/linux.git
mkdir 核心輸出

# 將編譯好的 gcc/binutils 二進製文件複製到 linux /bin 目錄
光碟
mkdir bin
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 feb 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 卡映像來測試生成的 vmlinux。

我希望編輯我的問題,以便該腳本對其他想要為其 RPi4 或其他設備編譯 ARM64 Linux 核心的人有用。

顯然,每個平台編譯 Linux 核心的正確過程是不同的:

# 在 32 位 x86 上
製作 bzImage

# 在 64 位 x86 上
製作 zImage

# 在 64 位 ARM 上
製作圖像

# 在目前目錄搜尋編譯好的linux核心
查找 ./ -iname "*Image"

引用自:https://unix.stackexchange.com/questions/636448