1、Makefile文件的作用
核心作用三点:
(1)决定哪些文件被编译
(2)怎样编译这些文件
(3)怎样连接这些文件,最重要的是他们的顺序如何
2、.config文件
make s3c2410_defconfig会将配置信息写入.config文件里面,Makefile文件都是直接或间接根据.config文件来决定编译哪些文件。
在顶层目录包含:include/config/auto.conf:
auto.conf就是根据.config文件生成的,并且加入了一些顶层Makefile文件的定义!顶层Makefile文件就是根据auto.conf编译!
3、从顶层Makefile开始分析
我们知道编译内核实际就是生成:vmlinux,于是:
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
我们可以看到内核的生成依赖于:head-y、init-y、core-y、libs-y、drivers-y、net-y
对于head-y、init-y、core-y、libs-y、drivers-y、net-y这些东西我们就不在贴代码了,直接说他们怎么生成的:
编译内核时,将依次进入init-y、core-y、libs-y、drivers-y、net-y所列出的目录,执行他们的Makefile文件,每个子目录都会生成一个built-in.o(libs-y所列目录下,有可能生成lib.a文件)。也就是说init-y、core-y、libs-y、drivers-y、net-y就对应着各个built-in.o文件,最后head-y所表示的文件和这些built-in.o文件被连接成内核文件vmlinux。
这里需要特别说明一下的是head-y所表示的文件,它是表示入口文件,看:
include $(srctree)/arch/$(ARCH)/Makefile
ARCH=arm
所以:
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
我们看到入口文件是:head.S
评论