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)