钦遭聘 发表于 2025-6-8 13:15:05

Lesson01-利用Makefile创建内核镜像文件kernel8.img

编写树莓派内核映像的过程可以等同于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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Lesson01-利用Makefile创建内核镜像文件kernel8.img