linux kernel makefile 分析 - 7
上一篇:https://www.cnblogs.com/zhangzhiwei122/p/16029312.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
__all -> all -> vmlinux -> ? 的依赖关系
1、18 ~ 19 我们的make 没有指定 编译目标,所以第一个目标 __all 作为默认目标
2、613 行,因为默认不是编译外部模块, __all 依赖到 all
3、660 all 依赖 vmlinux
4、跳过 729 ~ 1102 之间的各种,根据 auto.conf 配置进行各种设置 。
5、1169 设置 vmlinux 目标的依赖和更新规则
1164# Final link of vmlinux with optional arch pass after final link 1165cmd_link-vmlinux = \ 1166 $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \ 1167 $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) 1168 1169vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE 1170 +$(call if_changed,link-vmlinux)
1、FORCE 依赖,标识 vmlinux 目标一定的更新
2、vmlinux-deps
1138 设置变量的值
1176 设置依赖 descend 目标(暂时不 继续追查 descend 目标的更新规则 )
1138vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) 1176$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
KBUILD_LDS 是 vmlinux 使用的 ld link scripts 。 link-vmlinux.sh 脚本里面使用 KBUILD_LDS 这个变量名称来找 ld link script 的。
1134 行定义 并且 export
1134export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
KBUILD_VMLINUX_OBJS 链接进入 vmlinux 的所有 中间文件。 link-vmlinux.sh 脚本里面使用 KBUILD_VMLINUX_OBJS 这个变量名称
1123 行 $(head-y) core-y 目录中的 / 替换为 /built-in.a
1124 libs-y 中的 / 后面添加 built-in.a
1126 libs-y 中的 / 替换为 /lib.a
启用 CONFIG_MODULES 。 为了 防止模块里面 会使用到 lib.a 里面的内容,所以需要全部包含进来。
lib.a 放在 vmlinux_objs 里面,因为 scripts/link-vmlinux.sh 中规则,vmlinux_objs 里面的 .o 文件,作为整体填入 vmlinux ,不会丢弃任何内容。
vmlinux_libs 里面的代码则会根据需要添加一部分。没有被需要的,就不加入到 vmlinux 中。
1131 drivers-y 中的 / 体会为 /built-in.a
KBUILD_VMLINUX_LIBS 链接进入
1127 如果 CONFIG_MODULES 启用了内核模块 功能, libs-y 中 的非目录。 目录下面的 lib.a 已经被保护到 vmlinux_objs 里面了。
1129 如果没 启用 内核模块,libs-y 所有(如果是目录,就取 /lib.a ) 都放在 vmlinux_libs 里面。
vmlinux_libs 里面的代码是按需加载的。因为不支持 内核模块,所以所有的 lib.a 里面,不需要的代码都可以丢弃,不放进 vmlinux 中。
1122# Externally visible symbols (used by link-vmlinux.sh) 1123KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y)) 1124KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y))) 1125ifdef CONFIG_MODULES 1126KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y))) 1127KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y)) 1128else 1129KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y)) 1130endif 1131KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y)) 1132 1133export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
3、autoksyms_recursive
auto kernel symbols recursive 只有 CONFIG_TRIM_UNUSED_KSYMS 裁减 vmlinux 中没有用到的符合时,这个目标才有实质效果。
1141 定义伪目标 autoksyms_recursive
1142 ~ 1151 被 CONFIG_TRIM_UNUSED_KSYMS 配置包裹,在里面的 1148 行定义 autoksyms_recursive 目标的依赖和更新规则
1140# Recurse until adjust_autoksyms.sh is satisfied 1141PHONY += autoksyms_recursive 1142ifdef CONFIG_TRIM_UNUSED_KSYMS 1143# For the kernel to actually contain only the needed exported symbols, 1144# we have to build modules as well to determine what those symbols are. 1145# (this can be evaluated only once include/config/auto.conf has been included) 1146KBUILD_MODULES := 1 1147 1148autoksyms_recursive: descend modules.order 1149 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \ 1150 "$(MAKE) -f $(srctree)/Makefile vmlinux" 1151endif
4、link-vmlinux.sh
这个脚本文件 内核源码里面提供。
https://lxr.missinglinkelectronics.com/#linux/scripts/link-vmlinux.sh
下一篇:
descend build-dirs prepare