内核编译(四):Makefile解析(一)

2019-07-13 05:29发布

    对于上节,我们分析了内核的配置过程。本节,我们就来分析内核的Makefile,也就是编译中最重要的部分。在内核源码中,Makefile也是分层的,不同层,不同目录的Makefile,功能都不同,下面有一张图,来自韦老师的《嵌入式Linux应用完全开发手册》对它们进行了详细地解释:
对于顶层的Makefile,则是控制内核编译的主框架,在主Makefile里,包含着其它大大小小的其它目录的Makefile。.config这个文件我们应该已经很熟悉了,上节课已经分析过它了。arch/$(ARCH)/Makefile,表示架构下的Makefile,ARCH是一个变量,它在顶层Makefile中定义:
我们可以看到,这个变量的值为arm,表示我们的CPU架构是arm架构。所以我们编译时是使用arch/arm目录下的Makefile。我们可以这样理解:       1.顶层Makefile决定内核根目录下哪些子目录将被编进内核
    2.arch/$(ARCH)/Makefile决定arch/$(ARCH)目录下哪些文件、哪些目录将被编进内核
    3.各级子目录下的Makefile决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile。对于Makefile的详细目录结构与说明,我们可以看内核源码中里的文档,在内核源码目录下的Documentationkbuild这个目录中。    我们首先从子目录里的Makefile分析起。我们打开drivers/char目录里的Makefile:

可以看到,它和我们上节课分析的那个Makefile是非常类似的,对于obj-y里的文件,最终是要链接进内核里的,对于obj-m里的文件,则是被当作驱动模块(.ko)。这里有个问题要提一下:如果我想要几个文件合成一个模块,该怎么做呢?我们可以这么做:    obj-m+=ab.o
    ab-objs:=a.o b.o
接下来,我们来看到最顶层的Makefile。我们编译内核的时候是直接make uImage的,所以我们搜索一下uImage。然而,我们会发现,根本是搜索不到结果的,这是为什么呢?其实,uImage这个规则并不在顶层的Makefile里,只是顶层的Makefile包含有有关于这个规则的文件。那么,这个文件在哪里呢?其实uImage,zImage这些文件都是属于ARM Linux里面的映像文件,所以他们应该在arch/arm目录下的Makefile里,我们打开这个Makefile后,直接搜素就可以找到了:
我们可以看到,uImage,zImage这些都是依赖于vmlinux。uImage和zImage其实都是一种压缩格式的映像,而vmlinux则是不压缩的一个elf文件。我们在这个文件里面搜索vmlinux,是搜不到它的规则的,它真正的定义是在顶层的Makefile里,因为vmlinux已经是对任何架构来说都是通用的了。我们在顶层Makefile里面搜索(有很多关键字,要多搜几次),就可以找到vmlinux的规则了:
下节课,我们在具体分析vmlinux这个规则里面所做的事情。