為保持源碼目錄整潔,推薦使用外部構建目錄:
export BUILD_DIR=/tmp/build
make mini2440_config
make all
# 或一條命令:
make O=/tmp/build mini2440_config
make all
Makefile 會自動識別 O= 參數,將 OBJTREE 設為輸出目錄,SRCTREE 為源碼目錄。
HOSTARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/arm.*/arm/ ...)
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
自動識別編譯主機架構(如 x86 → i386)與操作系統(Linux → linux)。
./mkconfig mini2440 arm arm920t mini2440 samsung s3c24x0
參數含義:
Target=mini2440、Arch=arm、CPU=arm920t、Board=mini2440、Vendor=samsung、SoC=s3c24x0
include/asm → asm-arm、include/asm-arm/arch → arch-s3c24x0、include/asm-arm/proc → proc-armvinclude/config.mk:記錄 ARCH、CPU、BOARD、VENDOR、SOCinclude/config.h:#define CONFIG_BOARDDIR board/samsung/mini2440#include #include 若無 include/config.mk 直接報錯 System not configured。
從 include/common.h(間接包含 config.h)提取所有 CONFIG_* 宏,經 sed 處理生成 Make 可用的變量定義。
核心依賴順序:
depend → SUBDIRS(tools/examples) → OBJS(cpu/arm920t/start.o) →
LIBS(arch/libarm.a, cpu/libarm920t.a, board/libsamsung.a, common/libcommon.a...) →
LDSCRIPT(cpu/arm920t/u-boot.lds) → u-boot (ELF) → u-boot.bin / System.map
各子目錄執行 make _depend 生成 .depend 文件,記錄 .o 依賴的 .h 文件。
OUTPUT_FORMAT("elf32-littlearm")
ENTRY(_start)
SECTIONS {
. = 0x00000000;
.text : {
cpu/arm920t/start.o (.text) /* 必須最先,復位向量 */
board/samsung/mini2440/lowlevel_init.o (.text)
board/samsung/mini2440/nand_read.o (.text)
*(.text)
}
.rodata : { *(.rodata*) }
.data : { *(.data) }
.u_boot_cmd : { *(.u_boot_cmd) } /* 命令表段 */
.bss (NOLOAD) : { *(.bss) }
}
TEXT_BASE = 0x33F80000(來自 board/samsung/mini2440/config.mk)決定最終鏈接地址。
arm-linux-ld -Bstatic -T u-boot.lds -Ttext 0x33F80000 \
--start-group libs --end-group -Map u-boot.map -o u-boot
提取命令表符號 __u_boot_cmd_start/end 通過 -u 強制鏈接。
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
--gap-fill=0xff 用 0xFF 填充段間隙,符合 NOR Flash 擦除特性。
arm-linux-nm u-boot | grep -v '...' | LC_ALL=C sort > System.map
供調試時地址↔符號查找使用。
| 文件/目錄 | 作用 |
|---|---|
| mkconfig | 配置腳本,生成鏈接、config.mk、config.h |
| include/config.mk | 架構/板級配置變量 |
| include/config.h | C 預處理宏配置 |
| include/autoconf.mk | Make 可用的 CONFIG_* 變量 |
| board/samsung/mini2440/ | 板級代碼:lowlevel_init, nand_read, config.mk(TEXT_BASE) |
| cpu/arm920t/ | CPU 相關:start.S, u-boot.lds, config.mk |
| lib_arm/ | ARM 通用庫 |
| common/ | 通用代碼:命令表、環境變量、控制台 |
make *_config,否則缺 config.mk 報錯。CROSS_COMPILE=arm-linux- 需在環境變量或 lib_arm/config.mk 設置。TEXT_BASE 需對應修改鏈接腳本與啟動代碼搬運邏輯。CONFIG_NAND_U_BOOT,原版 U-Boot 對 s3c2440 支持有限。