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 ${前綴} 解除安裝 ${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"