linux kernel makefile-神秘的built-in.o
在最后的链接过程中,我们可以看到,几乎所有的依赖条件中,都会生成一个built-in.o的文件。 那这个文件,是怎么生成的呢?
$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@
从这个规则中可以看到,vmlinux-dir目标是通过下面的make来生成的。展开一下看看。 这个build在scripts/Kbuild.include中。
make -f scripts/Makefile.build obj=$@
对应到test目录 那就是
make -f scripts/Makefile.build obj=test
这么看来,就要进到scripts/Makefile.build文件了。
PHONY := __build
__build:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
$(subdir-ym) $(always)
@:
__build是这个makefile的第一个目标,也是默认的目标。 这里面藏着一个builtin-target,看着很像,再搜搜。
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),)
builtin-target := $(obj)/built-in.o
endif
恩 原来这就是这么多叫built-in.o的原因。但是要生成buit-in.o,必须要以上的这些变量不能全部为空。
那再来看看编译这个built-in.o的规则是什么
quiet_cmd_link_o_target = LD $@
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
$(cmd_secanalysis),\
rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
$(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target)
targets += $(builtin-target)