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