編寫樹莓派內核映像的過程可以等同於gcc的編譯過程:預處理、編譯、彙編、鏈接,後面還會加一步:將可執行文件轉換成二進位的鏡像文件。 在MakeFile里的構建過程分為3步: 1.將.c文件經過預處理、編譯、彙編生成.o文件,將.S文件經過彙編生成.o文件。 2.將.o文件經過鏈接生成.elf可執行文 ...
編寫樹莓派內核映像的過程可以等同於gcc的編譯過程:預處理、編譯、彙編、鏈接,後面還會加一步:將可執行文件轉換成二進位的鏡像文件。
在MakeFile里的構建過程分為3步:
1.將.c文件經過預處理、編譯、彙編生成.o文件,將.S文件經過彙編生成.o文件。
2.將.o文件經過鏈接生成.elf可執行文件。
3.將.elf文件轉換成二進位的.img鏡像文件。
#變數-交叉編譯工具
ARMGNU ?= aarch64-linux-gnu
#變數-編譯可選參數
COPS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only
#變數-彙編可選參數
ASMOPS = -Iinclude
#變數-源文件目錄
SRC_DIR = src
#變數-生成文件目錄
BUILD_DIR = build
#構建-all首個構建對象
all: kernel8.img
#構建-clean
clean:
rm -rf $(BUILD_DIR) *.img
#構建-.c變.o
$(BUILD_DIR)/*_c.o: $(SRC_DIR)/*.c
mkdir -p $(@D)
$(ARMGNU)-gcc $(COPS) -MMD -c -o $@ $<
#構建-.S變.o
$(BUILD_DIR)/*_S.o: $(SRC_DIR)/*.S
$(ARMGNU)-gcc $(ASMOPS) -MMD -c -o $@ $<
#變數-.c文件
C_FILES = $(wildcard $(SRC_DIR)/*.c)
#變數-.S文件
ASM_FILES = $(wildcard $(SRC_DIR)/*.S)
#變數-.o文件
OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o)
OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_S.o)
#變數-.d文件
DEP_FILES = $(OBJ_FILES:%.o=%.d)
#函數-包含依賴.d文件
-include $(DEP_FILES)
#構建-.o變.elf .elf變.img
kernel8.img: $(SRC_DIR)/linker.ld $(OBJ_FILES)
$(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES)
$(ARMGNU)-objcopy $(BUILD_DIR)/kernel8.elf -O binary kernel.img