ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux kernel makefile 分析 - 8

2022-03-20 16:05:56  阅读:222  来源: 互联网

标签:dirs kernel resolve prepare makefile build libelf linux CONFIG


 

上一篇: 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://blog.csdn.net/lgjjeff/article/details/90511225

 

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

 

标签:dirs,kernel,resolve,prepare,makefile,build,libelf,linux,CONFIG
来源: https://www.cnblogs.com/zhangzhiwei122/p/16030252.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有