linux源码Makefile详解
(1)决定编译哪些文件
(2)怎样编译这些文件
(3)怎样连接这些文件,最重要的是它们的顺序如何
2.Linux内核Makefile分类
*********************************************************************
顶层Makefile:它是所有Makefile文件的核心,从总体上控制着内核的编译、
连接
.config :配置文件,在配置内核时生成,所有Makefile文件(包括顶层
目录及各级子目录)都是根据.config来决定使用哪些文件
arch/$(ARCH)/Makefile:对应于体系结构的Makefile,它用来决定哪些体系结
构相关的文件参与内核的生成,并提供一些规则来生成
特定格式的内核映像
scripts/Makefile.* : Makefile共用的通用规则、脚本等
kbuild Makefile :各级子目录下的Makefile,被上一层Makefile调用来编译
当前目录下的文件
*********************************************************************
3.根据Makefile的作用分析这5类文件
(1)决定编译哪些文件
Linux内核的编译过程从顶层Makefile开始,然后递归地进入各级子目录调用它们的Makefile,分为3个步骤:
(1)顶层Makefile决定内核根目录下哪些子目录将被编译进内核
在顶层Makefile中有如下内容:
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
......................
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
顶层Makefile将这13个子目录分为5类,除去include目录和后面不包
含内核源码的目录外,还有一个arch目录在arch/$(ARCH)/Makefile中被包
含进内核,在顶层Makefile中直接包含了这个Makefile,如下所示:
452 include $(srctree)/arch/$(SRCARCH)/Makefile
(2)arch/$(ARCH)/Makefile决定arch/$(ARCH)目录下哪些文件、哪些目录将
被编译进内核
在arch/arm/Makefile中有如下内容:
100 head-y := arch/arm/kernel/head$(MMUEXT).o
arch/arm/kernel/init_task.o
...............................................
196 core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
197 core-y += $(machdirs) $(platdirs)
198 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
199 core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
200 core-$(CONFIG_VFP) += arch/arm/vfp/
...............................................
204 libs-y := arch/arm/lib/ $(libs-y)
第100行中MMUEXT在arch/arm/Makefile前面定义,对于没有MMU的处
理器,使用文件head-nommu.S;对于有MMU的处理器,使用head.S文件
CONFIG_XXXX在配置内核时定义,它的值有3种:y、m或空
编译内核时将依次进入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
(3)各级子目录下的Makefile决定所在目录下哪些文件将被编译进内核,哪
些文件将被编译成模块(驱动程序),进入哪些子目录继续调用它们的
Makefile
在配置内核时,生成配置文件“.config”,根据.config中定义的各
个变量决定编译哪些文件,Makefile使用如下语句间接包含.config文
件(因为包含的是"include/config/auto.conf"文件):
486 -include include/config/auto.conf
在"include/config/auto.conf"文件中,变量的值为y或m
1)obj-y用来定义哪些文件被编进(built-in)内核
obj-y中定义的.o文件由当前目录下的.c或.S文件编译生成,
它们连同下级子目录的built-in.o文件一起被组合成(使用
“$(LD)-R”命令)当前目录下的built-in.o文件,这个built-in.o
文件被它的上一层Makefile使用
2)obj-m用来定义哪些文件被编译成可加载模块(Loadable module)
obj-m中定义的.o文件由当前目录下的.c或.S文件编译生成,
它们被编译成模块,一个模块可以由一个或几个.o文件组成,对于
有多个源文件的模块,除在obj-m中增加一个.o文件外,还要定义
一个<module_name>-objs变量来告诉Makefile这个.o文件由哪些
文件组成
例如:
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
3)lib-y用来定义哪些文件被编成库文件
liy-y中定义的.o文件由当前目录下的.c或.S文件编译生成,
它们被打包成当前目录下的一个库文件:lib.a ;同时出现在
obj-y和lib-y中的.o文件,不会被包含进lib.a中,要把这个
lib.a编译进内核中,需要在顶层Makefile中libs-y变量中列出
当前目录
4)obj-y、obj-m还可以指定要进入的下一层子目录
obj-$(CONFIG_JFFS2_FS) += jffs2/
(2)怎样编译这些文件----编译选项、连接选项是什么
这些选项可分为3类:
1)全局的
适用于整个内核代码,在顶层Makefile和arch/$(ARCH)/Makefile中
定义,这些选项的名称为CFLAGS(编译C文件的 选项)、AFLAGS(编译汇编
文件的选项)、LDFLAGS(连接文件的选项)、 ARFLAGS(制作库文件的选项)
2)局部的
在各个子目录中定义,针对当前Makefile中的所有文件,名称分别
为:EXTRA_CFLAGS、EXTRA_AFLAGS、EXTRA_LDFLAGS、EXTRA_ARFLAGS
3)个体的
仅适用于某个文件,如果想针对某个文件定义它的编译选项,可以使
用CFLAGS_$@, AFLAGS_$@,前者用于编译某个C文件,后者用于编译某
个汇编文件。$@表示某个目录文件
(3)怎样连接这些文件,它们的顺序如何
在顶层Makefile中,目录名的后面直接加上built-in.o或lib.a,表示
要连接进内核的文件,如下所示:
init-y := $(patsubst %/, %/built-in.o, $(init-y))
core-y := $(patsubst %/, %/built-in.o, $(core-y))
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
net-y := $(patsubst %/, %/built-in.o, $(net-y))
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
patsubst是个字符串处理函数,它的用法如下:
$( patsubst pattern, replacement, text)
表示寻找“text”中符合格式“pattern”的字,用“replacement”代替
它们,比如init-y的初值为“init/”,经过变换后变为“init/built-in.o”
再如下所示:
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/$(SRCARCH)/kernel/vmlinux.lds
vmlinux-all表示所有构成映象文件vmlinux的目标文件,可知这些目标文件的顺序为head-y、init-y、core-y、libs-y、drivers-y、net-y
4.总结
(1)配置文件.config中定义了一系列的变量,Makefile将结合它们来决定哪些
文件被编译进内核、哪些文件被编译成模块、涉及哪些子目录
(2)顶层Makefile和arch/$(ARCH)/Makefile决定根目录下哪些子目录、
arch/$(ARCH)目录下哪些文件和目录将被编译进内核
(3)各级子目录下的Makefile决定所在目录下的哪些文件将被编译进内核,哪些
文件被编译成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile
(4)顶层Makefile和arch/$(ARCH)/Makefile设置了可以影响所有文件的编译、
连接选项,即全局选项
(5)各级子目录下的Makefile中可以设置影响当前目录下所有文件的编译、连接
选项,即局部选项
(6)顶层Makefile按照一定的顺序组织文件,根据连接脚本arch/$(ARCH)
kernel/vmlinux.lds生成内核映象文件vmlinux
linux源码Makefile详解的更多相关文章
- linux源码Makefile详解(完整)【转】
转自:http://www.cnblogs.com/Daniel-G/p/3286614.html 随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 ...
- linux源码Makefile详解(完整)
转自:http://www.cnblogs.com/Daniel-G/p/3286614.html 随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 ...
- linux 源码安装详解
./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本.make是用来编译的,它从Makefile中读取指令,然后编 ...
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- NopCommerce源码架构详解
NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...
- Nop--NopCommerce源码架构详解专题目录
最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ...
- Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览
一.设计原理 1.Hadoop架构: 流水线(PipeLine) 2.Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS 3.Hadoop架构: 关于Recovery (Lease ...
- Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 关于RPC(Remote Procedure Call),如果没有概念,可以参考一下RMI(Remot ...
- Hadoop3.1.1源码Client详解 : 入队前数据写入
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇: Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立 先给出 ...
随机推荐
- 【转载】MySQL 日志 undo | redo
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- C#获取数据库中的Instance
如果我现在要写个代码生成器,连接数据库,那你得知道有哪些Database存在吧,不然咋整? 在VS中我们添加一个ADO.NET的实体模型 在选择数据库名称的时候就是获取了数据库中Database In ...
- 如何正确理解深度学习(Deep Learning)的概念
现在深度学习在机器学习领域是一个很热的概念,不过经过各种媒体的转载播报,这个概念也逐渐变得有些神话的感觉:例如,人们可能认为,深度学习是一种能够模拟出人脑的神经结构的机器学习方式,从而能够让计算机具有 ...
- centos 格式化硬盘并挂载,添加重启后生效
[root@cloud /]# passwd 更改用户 root 的密码 . 新的 密码: 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新. [root@cloud /]# fd ...
- 语音识别之梅尔频谱倒数MFCC(Mel Frequency Cepstrum Coefficient)
语音识别之梅尔频谱倒数MFCC(Mel Frequency Cepstrum Coefficient) 原理 梅尔频率倒谱系数:一定程度上模拟了人耳对语音的处理特点 预加重:在语音信号中,高频部分的能 ...
- Ubuntu下安装eclipse及PyDev插件注意事项
一.安装eclipse前一定要先安装jdk 1.到http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880 ...
- PythonChallenge 1:恺撒密码的解码
题目: 解题思路:根据图中的K→M,O→Q,E→G,我们可以发现K,O,E这三个字母都向后移动了2位.据说恺撒率先使用了这一加密方法,因此将其命名为恺撒密码.它的基本思想是:通过把字母移动一定的位数来 ...
- IOS crash分析
此处不讨论具体的如何根据.dsym文件解析crash log的方式. 什么是崩溃: 不希望出现的中断,APP收到了系统发出的unhandle signal,来源主要由系统内核,处理器,或者应用程序本身 ...
- ubuntu 安装git
问题描述: ubuntu安装git 问题解决: (1)ubuntu下载git 注: 使用命令apt-get install git安装 (2)查看g ...
- 【BZOJ】【2940】【POI2000】条纹
博弈论 一开始想成S-Nim了……后来发现不一样= =石子是一定得取的,但是这个铺条纹就像Crosses and Crosses一样,是可以铺到中间,左右留下空隙但是对手无处可放的…… 所以就是两道题 ...