找回密码
 立即注册
首页 业界区 安全 Lesson01-利用Makefile创建内核镜像文件kernel8.img ...

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

钦遭聘 2025-6-8 13:15:05
编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。
在MakeFile里的构建过程分为3步:
1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。
2.将.o文件经过链接生成.elf可执行文件。
3.将.elf文件转换成二进制的.img镜像文件。
  1. #变量-交叉编译工具
  2. ARMGNU ?= aarch64-linux-gnu
  3. #变量-编译可选参数
  4. COPS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only
  5. #变量-汇编可选参数
  6. ASMOPS = -Iinclude
  7. #变量-源文件目录
  8. SRC_DIR = src
  9. #变量-生成文件目录
  10. BUILD_DIR = build
  11. #构建-all首个构建对象
  12. all: kernel8.img
  13. #构建-clean
  14. clean:
  15.         rm -rf $(BUILD_DIR) *.img
  16. #构建-.c变.o
  17. $(BUILD_DIR)/*_c.o: $(SRC_DIR)/*.c
  18.         mkdir -p $(@D)
  19.         $(ARMGNU)-gcc $(COPS) -MMD -c -o $@ $<
  20. #构建-.S变.o
  21. $(BUILD_DIR)/*_S.o: $(SRC_DIR)/*.S
  22.         $(ARMGNU)-gcc $(ASMOPS) -MMD -c -o $@ $<
  23. #变量-.c文件
  24. C_FILES = $(wildcard $(SRC_DIR)/*.c)
  25. #变量-.S文件
  26. ASM_FILES = $(wildcard $(SRC_DIR)/*.S)
  27. #变量-.o文件
  28. OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o)
  29. OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_S.o)
  30. #变量-.d文件
  31. DEP_FILES = $(OBJ_FILES:%.o=%.d)
  32. #函数-包含依赖.d文件
  33. -include $(DEP_FILES)
  34. #构建-.o变.elf .elf变.img
  35. kernel8.img: $(SRC_DIR)/linker.ld $(OBJ_FILES)
  36.         $(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES)
  37.         $(ARMGNU)-objcopy  $(BUILD_DIR)/kernel8.elf -O binary kernel.img
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册