Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182723
  • 博文数量: 82
  • 博客积分: 3005
  • 博客等级: 少校
  • 技术积分: 785
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 16:05
文章分类

全部博文(82)

文章存档

2012年(5)

2011年(18)

2010年(59)

我的朋友

分类: LINUX

2010-05-04 20:10:15

Linux内核移植

1linux 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决定编译那些文件

1.1.1:顶层Makefile决定内核根目录下那些子目录将编译进内核

1.1.2Arch/$(ARCH)/Makefile决定哪些Arch/$(ARCH)/目录下哪些文件,哪些目录将被编进内核

1.1.3:各级子目录下Makefile决定所在目录下的那些文件将被编译进内核,哪些文件编译成模块,进入那些子目录继续调用它们的Makefile

init-y         := init/

drivers-y    := drivers/ sound/ firmware/

net-y         := net/

libs-y         := lib/

core-y       := usr/

顶层Makefile13个子目录分成5类:init-y,driver-y,net-y,libs-y,core-y

对于步骤1.1.2arch/$(ARCH)/Makefile,以ARM体系结构为例,体系结构下能看到很多makefile 的编译选项

编译内核时,将依次进入init-y,core-y,libs-y,drivers-ynet-y所有列出的目录中执行它们的makefile。每个子目录都会生成一个built-in..o(libs-y所列目录下,有可能生成lib.a文件)。最后head-y说表示的文件将和这些built-in.olib.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文件外,还要定义一个-objs变量来告诉makefile这个.o文件由那些文件组成

C:lib-y用来定义那些文件被编译成库文件

它由当前目录下的.c.S文件编译生成,生成lib.a文件;同时出现在obj-y.lib-y中的文件,不被编译成lib.要编译lib.a到内核中,需要把在顶层makefilelibs-y中加入当前目录。要编译成库文件的内核代码一般在/lib目录和/arch/$(ARCH)/lib/下。

D:obj-y,obj-m还可以用来指定要进入的下一级目录

1.2怎样编译这些文件

即编译选项,连接选项是什么。这些选项分为3类:全局的,使用在整个内核代码;局部的,仅适用在某个makefile文件的所有文件;个体的使用于某个文件

全局选项在顶层makefilearch/$(ARCH)/Makefile中定义,这些选项的名称是:CFLAGS,AFLAGS,LDFLAGS,ARFAGS,他们分别是编译C文件的选项,编译汇编文件的选项,连接文件的选项,制作库文件的选项

局部选项定义在子目录中,名称为:EXTRA_CFLAGS, EXTRA_ AFLAGS, EXTRA _LDFLAGS, EXTRA _ARFAGS他们的用途和上面的相同,但是使用范围小。只针对当前的makefile

针对某个文件的编译选项,可是使用CFLAGS_$@; 文件,后者编译汇编文件,

这三个选项可以一起使用!!!

1.3连接文件的顺序

在顶层makefilearch/$(ARCH)/Makefile定义6类目录:head-y,init-y,drivers-y,net-y,libs-ycore-y。他们的初始值在makefile中可以查到。

查看文件得知,除head-y外,其他的init-y等都是目录同名的,在顶层makefile中,这些目录名直接加上built-in.olib.a,表示要连接进内核的文件。

如:net-y:=$(patsubst%/,%build-in.o,$(net-y))

$(patsubst pattern,replacement,text)

表示寻找text中符合pattern的字,用replacement替换它

Patsubst是字符处理函数,表示

阅读(677) | 评论(0) | 转发(1) |
0

上一篇:书籍

下一篇:kermit

给主人留下些什么吧!~~