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

https://www.cnblogs.com/zhangzhiwei122/p/16030252.html

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