全部博文(82)
分类: LINUX
2010-05-04 20:10:15
Linux内核移植
1:linux makefile分析
Linux Makefile文件编译主要有以下3种作用
1.1:决定编译那些文件
1.2:怎样编译这些文件
1.3:怎样连接这些文件,最重要的是它们的顺序如何
Linux Makefile文件的分类
顶层Makefile:它是所有Makefile文件的核心,从总体上控制着内核的编译和链接
.config:配置文件,在配置内核时生成,所有的Makefile文件都是根据.config来决定使用那些文件
Arch/$(ARCH)/Makefile:对应体系结构的Makefile文件
Scripts/Makefile.*:Makefile共用的通用规则。脚本等
Kbuild Makefiles:各级子目录下的makefile,它们相对简单,被上一层的makefile调用来编译当前目录下的文件
1.1决定编译那些文件
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
顶层Makefile将13个子目录分成5类:init-y,driver-y,net-y,libs-y,core-y
对于步骤
编译内核时,将依次进入init-y,core-y,libs-y,drivers-y和net-y所有列出的目录中执行它们的makefile。每个子目录都会生成一个built-in..o(libs-y所列目录下,有可能生成lib.a文件)。最后head-y说表示的文件将和这些built-in.o,lib.a一起连接成内核映像文件vmlinux
在配置内核时,生成配置文件.config。内核顶层makefile使用如下语句间接包含.config文件,以后根据.config中定义的各个变量决定编译那些文件。之所以是间接包含,是因为包含的是include/config/auto.conf文件,而它只是将.config文件中的注释去掉,并根据makefile中的定义的变量增加一些变量而已
Include/config/auto.conf
A:Obj-y中定义的.o文件由当前目录的.c和.S文件编译而成,他们连同下级子目录的built-in.o文件一起组合成当前的目录下的build-in.o文件。这个build-in.o文件将被上级makefile使用。
Obj-y中各个.o文件的顺序是有意义的,因为内核中用module_init()和__initcall()定义的函数将按照他们的连接顺序被调用。
B:Obj-m用来定义那些文件被编译成可加载的模块
Obj-m中定义的.o文件由当前目录下的.s和.c文件编译生成,而他们不被编译进build-in.o中,而被编译成模块。一个模块可以由几个.o文件组成,对于只有一个源文件的模块,在obj-m中直接增加它的。O文件即可。对于多个文件组成的模块,除在obj-m增加的.o文件外,还要定义一个
C:lib-y用来定义那些文件被编译成库文件
它由当前目录下的.c和.S文件编译生成,生成lib.a文件;同时出现在obj-y.lib-y中的文件,不被编译成lib.要编译lib.a到内核中,需要把在顶层makefile中libs-y中加入当前目录。要编译成库文件的内核代码一般在/lib目录和/arch/$(ARCH)/lib/下。
D:obj-y,obj-m还可以用来指定要进入的下一级目录
1.2怎样编译这些文件
即编译选项,连接选项是什么。这些选项分为3类:全局的,使用在整个内核代码;局部的,仅适用在某个makefile文件的所有文件;个体的使用于某个文件
全局选项在顶层makefile和arch/$(ARCH)/Makefile中定义,这些选项的名称是:CFLAGS,AFLAGS,LDFLAGS,ARFAGS,他们分别是编译C文件的选项,编译汇编文件的选项,连接文件的选项,制作库文件的选项
局部选项定义在子目录中,名称为:EXTRA_CFLAGS, EXTRA_ AFLAGS, EXTRA _LDFLAGS, EXTRA _ARFAGS他们的用途和上面的相同,但是使用范围小。只针对当前的makefile
针对某个文件的编译选项,可是使用CFLAGS_$@; 文件,后者编译汇编文件,
这三个选项可以一起使用!!!
1.3连接文件的顺序
在顶层makefile和arch/$(ARCH)/Makefile定义6类目录:head-y,init-y,drivers-y,net-y,libs-y和core-y。他们的初始值在makefile中可以查到。
查看文件得知,除head-y外,其他的init-y等都是目录同名的,在顶层makefile中,这些目录名直接加上built-in.o或lib.a,表示要连接进内核的文件。
如:net-y:=$(patsubst%/,%build-in.o,$(net-y))
$(patsubst pattern,replacement,text)
表示寻找text中符合pattern的字,用replacement替换它
Patsubst是字符处理函数,表示