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)

posted @ 2022-02-12 12:57  张志伟122  阅读(678)  评论(0编辑  收藏  举报