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

 

posted @ 2022-03-20 15:53  张志伟122  阅读(977)  评论(0编辑  收藏  举报