1. 程式人生 > 其它 >linux kernel makefile-神祕的built-in.o

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)