linux kernel makefile 分析 - 8
上一篇: https://www.cnblogs.com/zhangzhiwei122/p/16029589.html
背景说明
版本:
5.10.0 - 下面分析中 使用的行号,都是 参考 这个 版本的 Makefile 。
在线浏览: https://lxr.missinglinkelectronics.com/linux/Makefile
使用场景:
根据 https://www.cnblogs.com/zhangzhiwei122/p/16029312.html 中的分析,在make vmlinux 之前一定需要先 make xxconfig 生成一个 .config 文件,
所以 从 第7篇 开始的场景 定义为如下:
在源码文件夹下面建立一个build 文件夹,然后使用 O=build
mkdir build
# 生成 .config 文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build defconfig
# 使用 .config 文件 编译 默认目标 __all -> all -> vmlinux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build
descend & build-dirs & prepare
1176 vmlinux-deps 依赖 descend
1176$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
descend 依赖 build-dirs ; build-dirs 依赖prepare
1802PHONY += descend $(build-dirs) 1803descend: $(build-dirs) 1804$(build-dirs): prepare 1805 $(Q)$(MAKE) $(build)=$@ \ 1806 single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \ 1807 need-builtin=1 need-modorder=1
build-dirs 的内容和生成
648 ~ 653 定义了 core-y drivers-y libs-y
1105 又对 core-y 进行了补充
1107 行,将所有的 core-y core-m drivers-y drivers-m libs-y libs-m 中的,以 / 结尾的 (即目录) 都 找出来,然后去掉 末尾的 / 符号,放到 vmlinux-dirs 里面
1119 行,将 vmlinux-dirs 赋值给 build-dirs 。里面 是 需要编译 的 顶级文件夹名称(不带 / )
build-dirs= init usr drivers sound net virt lib kernel certs mm fs ipc security crypto block arch/arm64 arch/arm64/lib
648# Objects we will link into vmlinux / subdirs we need to visit 649core-y := init/ usr/ 650drivers-y := drivers/ sound/ 651drivers-$(CONFIG_SAMPLES) += samples/ 652drivers-y += net/ virt/ 653libs-y := lib/ 1105core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ 1106 1107vmlinux-dirs := $(patsubst %/,%,$(filter %/, \ 1108 $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ 1109 $(libs-y) $(libs-m))) 1119build-dirs := $(vmlinux-dirs)
build-dirs 生成规则
1804$(build-dirs): prepare 1805 $(Q)$(MAKE) $(build)=$@ \ 1806 single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \ 1807 need-builtin=1 need-modorder=1
合并后为:
$(Q)$(MAKE) $(build)=$@ single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) need-builtin=1 need-modorder=1
举例:
make $(build)=init single-build= need-builtin=1 need-modorder=1
关于 $(build)=xx 来编译一个子目录里面内容 的用法,可以参考
https://www.cnblogs.com/zhangzhiwei122/p/16030297.html
build-dirs 里面的目标完成,顶级 目录文件夹下面的 built-in.o lib.a 就都生成好了。可以链接进入 vmlinux 里面了。
build-dirs 依赖 的prepare 生成
prepare 依赖 prepare0 prepare-objtools prepare-resolve_btfids
1204 prepare0 依赖 archprepare ,
1205 prepare0 的生成规则,即使用 $(build)= 来编译 script/mod 目录和 ./ 目录
1200 里面列出了 archprepare 依赖的子目标,这些子目标 大多 都可以直接找到 其 生成规则。不再详细分析。
1199 1200archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \ 1201 asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \ 1202 include/generated/autoconf.h 1203 1204prepare0: archprepare 1205 $(Q)$(MAKE) $(build)=scripts/mod 1206 $(Q)$(MAKE) $(build)=. 1207 1208# All the preparing.. 1209prepare: prepare0 prepare-objtool prepare-resolve_btfids
prepare-objtool
1080 ~ 1087 如果 CONFIG_STACK_VALIDATION 即需要 栈校验 ,才有 objtool_target (为 tools/objtool 这个工具)
1080ifdef CONFIG_STACK_VALIDATION 1081 ifeq ($(has_libelf),1) 1082 objtool_target := tools/objtool FORCE 1083 else 1084 SKIP_STACK_VALIDATION := 1 1085 export SKIP_STACK_VALIDATION 1086 endif 1087endif
如果打开了 CONFIG_STACK_VALIDATION ,但是主机上面又没有 libelf , 这是 prepare-objtool 才有 生成动作,生成动作也即是 报错 Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev 。
1223prepare-objtool: $(objtool_target) 1224ifeq ($(SKIP_STACK_VALIDATION),1) 1225ifdef CONFIG_UNWINDER_ORC 1226 @echo "error: Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel" >&2 1227 @false 1228else 1229 @echo "warning: Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel" >&2 1230endif 1231endif
prepare-resolve_btfids
这个和 上面的 prepare-objtool 类似。只是配置 变为 CONFIG_DEBUG_INFO_BTF
1089ifdef CONFIG_BPF 1090ifdef CONFIG_DEBUG_INFO_BTF 1091 ifeq ($(has_libelf),1) 1092 resolve_btfids_target := tools/bpf/resolve_btfids FORCE 1093 else 1094 ERROR_RESOLVE_BTFIDS := 1 1095 endif 1096endif # CONFIG_DEBUG_INFO_BTF 1097endif # CONFIG_BPF
如果打开了 CONFIG_BPF && CONFIG_DEBUG_INFO_BTF ,但是主机上面又没有 libelf , 这是 prepare-resolve_btfids 才有 生成动作,动作即是报错 resolve BTF IDs for CONFIG_DEBUG_INFO_BTF, please install libelf-dev
1233prepare-resolve_btfids: $(resolve_btfids_target) 1234ifeq ($(ERROR_RESOLVE_BTFIDS),1) 1235 @echo "error: Cannot resolve BTF IDs for CONFIG_DEBUG_INFO_BTF, please install libelf-dev, libelf-devel or elfutils-libelf-devel" >&2 1236 @false 1237endif
下一篇:
$(build)=xx 分析
https://www.cnblogs.com/zhangzhiwei122/p/16030297.html