4,465
社区成员




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就是更新之后的了。 CHK include/linux/version.h
CHK include/linux/utsrelease.h
SYMLINK include/asm -> include/asm-x86
CALL scripts/checksyscalls.sh
CHK include/linux/compile.h <------- 这时候还是version #5,因为只CHK,没有UPD
LD vmlinux.o <------- 生成vmlinux.o,应该不包含version.o
MODPOST vmlinux.o
GEN .version <-------- 更新版本号(#5->#6)
CHK include/linux/compile.h <-------- 重新执行mkcompile_h
UPD include/linux/compile.h <-------- 由于版本号更新,更新linux/compile.h文件
CC init/version.o <-------- 生成新的version.o
LD init/built-in.o <-------- 以下是最后的链接过程
LD .tmp_vmlinux1
KSYM .tmp_kallsyms1.S
AS .tmp_kallsyms1.o
LD .tmp_vmlinux2
KSYM .tmp_kallsyms2.S
AS .tmp_kallsyms2.o
LD .tmp_vmlinux3
KSYM .tmp_kallsyms3.S
AS .tmp_kallsyms3.o
CHK include/linux/version.h
make[2]: “scripts/unifdef”是最新的。
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
$(obj)/version.o: include/linux/compile.h
# compile.h changes depending on hostname, generation number, etc,
# so we regenerate it always.
# mkcompile_h will make sure to only update the
# actual file if its content has changed.
chk_compile.h = :
quiet_chk_compile.h = echo ' CHK $@'
silent_chk_compile.h = :
include/linux/compile.h: FORCE
@$($(quiet)chk_compile.h)
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)"
~