编写树莓派内核映像的过程可以等同于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
标签:树莓,img,镜像文件,编译,构建,BUILD,DIR
From: https://www.cnblogs.com/kirito-/p/18412943