1. 程式人生 > 其它 >linux kernel makefile 分析 - 7

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