顶部的makefile包含archmakefile,读取.config文件,进入子目录,调用制作,使中定义的例程的帮助下实现每个组件的makefile。scripts/Makefile*,构建每个中间对象,并将所有中间对象链接到vmlinux。核心文件Documentation/kbuild/makefiles.txt描述这些制作文件的所有方面。
例如,让我们看看在x86-64上如何生成vmlinux:

(插图是根据理查德·Y·史蒂文(Richard Y.Steven)的博客。经提交人许可后予以更新和使用。
所有.o进入vmlinux的文件首先进入它们自己的built-in.a,这是通过变量表示的。KBUILD_VMLINUX_INIT, KBUILD_VMLINUX_Main, KBUILD_VMLINUX_LIBS,然后收集到vmlinux文件中。
看看如何在Linux内核中实现递归make,并借助简化的Makefile代码:
| # In top Makefile vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) +$(call if_changed,link-vmlinux) # Variable assignments vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS) export KBUILD_VMLINUX_INIT := $(head-y) $(init-y) export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y2) $(drivers-y) $(net-y) $(virt-y) export KBUILD_VMLINUX_LIBS := $(libs-y1) export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds init-y := init/ drivers-y := drivers/ sound/ firmware/ net-y := net/ libs-y := lib/ core-y := usr/ virt-y := virt/ # Transform to corresponding built-in.a init-y := $(patsubst %/, %/built-in.a, $(init-y)) core-y := $(patsubst %/, %/built-in.a, $(core-y)) drivers-y := $(patsubst %/, %/built-in.a, $(drivers-y)) net-y := $(patsubst %/, %/built-in.a, $(net-y)) libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) libs-y2 := $(patsubst %/, %/built-in.a, $(filter-out %.a, $(libs-y))) virt-y := $(patsubst %/, %/built-in.a, $(virt-y)) # Setup the dependency. vmlinux-deps are all intermediate objects, vmlinux-dirs # are phony targets, so every time comes to this rule, the recipe of vmlinux-dirs # will be executed. Refer "4.6 Phony Targets" of `info make` $(sort $(vmlinux-deps)): $(vmlinux-dirs) ; # Variable vmlinux-dirs is the directory part of each built-in.a vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) $(core-y) $(core-m) $(drivers-y) $(drivers-m) $(net-y) $(net-m) $(libs-y) $(libs-m) $(virt-y))) # The entry of recursive make $(vmlinux-dirs): $(Q)$(MAKE) $(build)=$@ need-builtin=1 |
递归的配方扩展,例如:
make -f scripts/Makefile.build obj=init need-builtin=1
这意味着make将进入scripts/Makefile.build继续建造每一个built-in.a。在.的帮助下scripts/link-vmlinux.sh,vmlinux文件最终位于源根下。
理解vmlinux与bzImage
许多Linux内核开发人员可能不清楚vmlinux和bzImage之间的关系。例如,以下是它们在x86-64中的关系:








