相关步骤,由根目录下的Makefile定义
参考以下makefile变量的定义
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
...
$(call if_changed_rule,vmlinux__)
...
if_changed_rule在scripts/Kbuild.include里定义,利用make的$?发现更新的依赖文件,有关有更新,执行命令。
即,如果vmlinux的依赖部分发生了变化(也就是说,【有源代码的变化】),则执行rule_vmlinux__
define rule_vmlinux__:
...
$(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
$(call cmd,vmlinux__)
...
endef
分别调用cmd_vmlinux_version和cmd_vmlinux__
quiet_cmd_vmlinux_version = GEN .version
cmd_vmlinux_version = set -e; \
if [ ! -r .version ]; then \
rm -f .version; \
echo 1 >.version; \
else \
mv .version .old_version; \
expr 0$$(cat .old_version) + 1 >.version; \
fi; \
$(MAKE) $(build)=init
更新.version文件,重新make object=init,如前所述,这会导致更新compile.h,【包含新的时间戳】
进而重新生成init/build-in.o(含version.o)
cmd_vmlinux__ 重新链接,显示LD vmlinux,就不再上代码了。
这样,vmlinux的uname -r就是更新之后的了。