編譯 U-Boot 2013.07 時,鏈接階段報錯:
/bin/bash: line 1: 8974 段錯誤 (core dumped)
make: *** [u-boot] Error 139
Error 139 = `SIGSEGV` (段錯誤),通常意味著**編譯器/鏈接器自身崩潰**,而非代碼邏輯錯誤。
# 1. 徹底清理 (關鍵!)
make distclean # 或 rm -rf 源碼目錄重新解壓
# 2. 確認工具鏈環境變量唯一
export CROSS_COMPILE=arm-unknown-linux-gnueabi-
# 驗證
${CROSS_COMPILE}gcc --version
# 3. 單一配置編譯
make smdk2410_defconfig # 或你的具體板級配置
make -j$(nproc)
#!/bin/bash
# build_uboot.sh
set -euo pipefail
BOARD_CONFIG="smdk2410_defconfig"
CROSS_COMPILER="arm-unknown-linux-gnueabi-"
UBOOT_DIR="u-boot-2013.07"
# 進入目錄
cd "${UBOOT_DIR}"
# 乾淨構建
echo "=== Cleaning ==="
make distclean
echo "=== Configuring: ${BOARD_CONFIG} ==="
make "${BOARD_CONFIG}"
echo "=== Building with ${CROSS_COMPILER} ==="
make CROSS_COMPILE="${CROSS_COMPILER}" -j$(nproc)
echo "=== Done: u-boot.bin ==="
ls -lh u-boot.bin
| 前綴 | 目標架構 | C 庫 | 典型發布版 |
|---|---|---|---|
| arm-none-linux-gnueabi- | ARM (bare-metal / Linux) | glibc | CodeSourcery / Linaro 早期 |
| arm-none-eabi- | ARM Cortex-M (bare-metal) | newlib / nano | GCC ARM Embedded |
| arm-linux-gnueabi- | ARM Linux (soft-float) | glibc | Debian/Ubuntu 套件 |
| arm-linux-gnueabihf- | ARM Linux (hard-float VFP) | glibc | 現代 Debian/Ubuntu/Raspberry Pi |
| arm-unknown-linux-gnueabi- | ARM Linux (舊 ABI) | glibc | crosstool-NG 默認、舊版構建 |
| aarch64-linux-gnu- | ARM64 Linux | glibc | 標準 64 位工具鏈 |
鐵律:**全專案統一前綴**,包括內核、U-Boot、文件系統、應用程序。混用 = 災難。
# Dockerfile.uboot-build
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
build-essential gcc-arm-linux-gnueabihf u-boot-tools \
git make bc cpio gzip
WORKDIR /src
# 將源碼 COPY 進鏡像或掛載卷
# docker run --rm -v $(pwd):/src uboot-builder ./build_uboot.sh
**優勢**:環境不可變、可復現、CI/CD 直接複用、宿主機無污染。
核心教訓: 交叉編譯**環境一致性**是生命線。任何「試探性編譯」都會污染構建產物。**`make distclean` + 統一 `CROSS_COMPILE` + 單一配置** 是鐵律。現代項目請直接用 Docker 固化工具鏈,消除「在我機器上能跑」的玄學問題。