本文針對早期 Linux 內核(v0.11 風格)根目錄 Makefile 進行逐行註解,涵蓋變量定義、隱式規則、目標構建、依賴生成等核心機制,幫助理解內核建構流程。
| 變量 | 含義 | 典型值 |
|---|---|---|
| AS86, CC86, LD86 | 8086 組譯/編譯/鏈接工具 | as -0 -a, cc -0, ld -0 |
| AS, LD | GNU 組譯器/鏈接器 | gas, gld |
| LDFLAGS | 鏈接器參數 | -s -x -M (去符號、輸出映像) |
| CC | C 編譯器 | gcc |
| CFLAGS | 編譯優化參數 | -Wall -O -fstrength-reduce -fomit-frame-pointer -fcombine-regs |
| CPP | 預處理器 | gcc -E -nostdinc -Iinclude |
| ARCHIVES | 核心模組目標文件 | kernel/kernel.o mm/mm.o fs/fs.o |
| LIBS | 庫文件 | lib/lib.a |
.c.s: # .c → .s (組譯碼)
$(CC) $(CFLAGS) -nostdinc -Iinclude -S -o $*.s $<
.s.o: # .s → .o
$(AS) -c -o $*.o $<
.c.o: # .c → .o (直接編譯)
$(CC) $(CFLAGS) -nostdinc -Iinclude -c -o $*.o $<
$*.s、$@ 為自動變量,$< 代表第一個依賴文件。
Image。boot/boot、tools/system、tools/build,調用 tools/build 組裝並 sync 寫盤。boot/head.o、init/main.o、ARCHIVES、LIBS,輸出 System.map。kernel/kernel.o、mm/mm.o、fs/fs.o、lib/lib.a 均通過 (cd dir; make) 遞歸構建。tools/system 計算長度生成 tmp.s,組譯鏈接產生引導扇區。Image、System.map、*.o、core 等)。clean 後,打包壓縮整個 linux/ 目錄為 backup.Z。.c 文件 #include 依賴,自動更新 Makefile 尾部 ### Dependencies 之後內容。dep:
sed '/### Dependencies/q' < Makefile > tmp_make
(for i in init/*.c; do echo -n "init/"; $(CPP) -M $$i; done) >> tmp_make
cp tmp_make Makefile
(cd fs; make dep) ... # 遞歸子目錄
利用 gcc -M 輸出標準 make 依賴規則,實現頭文件變更自動觸發重編譯。
這個 Makefile 展示了早期 Linux 內核構建的精髓:模組化目標、遞歸構建、自動依賴追蹤、引導扇區動態生成,為現代內核構建系統奠定基礎。
Linux /boot 分區空間不足?三步驟清理舊核心釋放空間完整教學
Linux 靜態路由永久生效配置指南:route 命令、rc.local、static-routes 三種方案對比
Linux 網路管理核心指令大全:ftp、telnet、r 命令、netstat、nslookup、finger、ping
Linux 壓縮解壓縮命令大全:tar、gzip、bzip2、xz、zip、7z 完整速查
Oracle 修改字符集解決中文亂碼:ALTER DATABASE CHARACTER SET 實戰與風險規避
Linux 十大「快速操作」技巧:自動掛載、Loadlin 安裝、快速開機、批次建檔、歷史指令、編輯器熱鍵、抗斷電關機、遞迴刪除、虛擬終端、萬用字元解壓