1. Makefile种类
名称 | 描述 |
---|---|
顶层Makefile | 它是所有Makefile文件的核心,从总体上控制着内核的编译、链接。 |
.config | 配置文件,配置内核时生成。顶层以及各子目录Makefile都是根据.config来决定使用哪些文件。 |
arck/%(ARCK)/Makefile | 对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生产特定格式的内核映像。 |
scripts/Makefile.* | Makefile公用的通用通用规则、脚本。 |
kbuild Makefiles | 各级子目录的Makefile,它们相对简单,被上一层Makefile调用来编译当前目录下的文件。 |
Makefile文档:<kernel path>/Documentation/kbuild/makefiles.txt
2. 子目录Makefile
example:
obj-$(CONFIG_XXX) +=yyy.o
用来表示该选项编译进内核还是编译为模块。
如果多个文件编译为一个模块:
example:
obj-$(CONFIG_ISDN)+= isdn.o
isdn-objs:=isdn_net_lib.o isdn_v110.o isdn_common.o
若CONFIG_ISDN=m
则最终生成isdn.ko
文件。
3. 架构相关的Makefile
例如ARM平台:
<kernel path>/arch/arm/Makefile
4. .config文件
我们知道.config
文件在编译时会生成auto.conf
,在顶层Makefile中:
我们发现-include includ/config/zuto.conf
,即顶层Makefile中包含了auto.conf
文件。
5. 顶层Makefile
我们编译内核时 使用make uImage
命令。以此为线索,我们发现:
顶层Makefile:
include $(srctree)/arch/$(ARCH)/Makefile
其中:
ARCH ?=arm
即include <kernel dir>/arch/arm/Makefile
即顶层目录包含了架构的Makefile。
我们打开架构Makefile:
uImage : vmlinux
因此我们才能在顶层目录执行make uImage
生成uImage
。
而uImage
依赖于vmlinux
。
我们发现vmlinux
的依赖:
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
$(call if_changed_rule,vmlinux__)
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
$(Q)rm -f .old_version
即vmlinux
依赖于:
vmlinux-lds
vmlinux-init
vmlinux-main
kallsyms.o
这些参数完全展开后就是vmlinux的依赖项。其中包括了第一个文件:arch/arm/kernel/head.S
以及链接脚本:arch/arm/kernel/vmlinux.lds
vmlinux
的编译规则,如果将其展开同样会很庞大,我们直接make uImage V=1
查看构建过程,
在最后链接vmlinux
时可以看到vmlinux
是如何构成的:
arm-linux-ld -EL -p --no-undefined -X -o vmlinux
-T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o
小结:
这里最重要的是剖析了Makefile,目的是了解内核的编译过程。最重要的两个文件:第一个文件:arch/arm/kernel/head.S
以及链接脚本:arch/arm/kernel/vmlinux.lds