- 浏览: 1439660 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
从Linux
内核2.6
开始,Linux
内核的编译采用Kbuild
系统
,这同过去的编译系统有很大的不同,尤其对于Linux
内核模块的编译。在新的系统下,Linux
编译系统会两次扫描Linux
的Makefile
:首先编译系统会读取Linux
内核顶层的Makefile
,然后根据读到的内容第二次读取Kbuild
的Makefile
来编译Linux
内核。
Linux
内核Makefile
分类
·
Kernel Makefile
Kernel Makefile
位于Linux
内核源代码的顶层目录,也叫 Top Makefile
。它主要用于指定编译Linux Kernel
目标文件(vmlinux
)和模块(module
)。这编译内核或模块是,这个文件会被首先读取,并根据读到的内容配置编译环境变量。对于内核或驱动开发人员来说,这个文件几乎不用任何修改。
·
Kbuild Makefile
Kbuild
系统使用Kbuild Makefile
来编译内核或模块。当Kernel Makefile
被解析完成后,Kbuild
会读取相关的Kbuild Makefile
进行内核或模块的编译。Kbuild Makefile
有特定的语法指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。内核及驱动开发人员需要编写这个Kbuild Makefile
文件。
·
ARCH Makefile
ARCH Makefile
位于ARCH/$(ARCH)/Makefile
,是系统对应平台的Makefile
。Kernel Top Makefile
会包含这个文件来指定平台相关信息。只有平台开发人员会关心这个文件。
·
目标定义
Kbuild Makefile
的一个最主要功能就是指定编译什么,这个功能是通过下面两个对象指定的obj-?
和xxx-objs
:
·
obj-?
obj-?
指定编译什么,怎么编译?其中的“?
”可能是“y
”或“m
”,“y
”指定把对象编译进内核中,“m
”指定把对象编译为模块。语法如下; ·
xxx-objs
xxx-objs
指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。
只要包含了这两行,Kbuild Makefile
就应该可以工作了。
·
嵌套编译
有时一个对象可能嵌入到另一个对象的目录下,那个如何编译子目录下的对象呢?
其实很简单,只要指定obj_?
的对象为子目录的名字就可以了:
obj-? = $(sub_target)/
其中“?
”可以是“y
”或“m
”,$(sub_target)
是子目录名字。
·
编译器选项
尽管在大多数情况下不需要指定编译器选项,有时我们还是需要指定一些编译选项的。
·
ccflags-y, asflags-y and ldflags-y
这些编译选项用于指定cc
、as
和ld
的编译选项
编译外部模块
make -C $(KERNEL_DIR) M=`pwd` modules ##Makefile
## Kbuild ifneq ($(KERNELRELEASE),) ·
EXTRA_CFLAGS
EXTRA_CFLAGS
可以给Kbuild
系统添加外部系统头文件, ·
$(src)/$(obj)
$(src)
是一个相对路径,它就是Makefile/Kbuild
文件所在的路径。同样$(obj)
就是编译目标保存的路径,默认就是源代码所在路径。
## Kbuild
Kbuild Makefile
Kbuild Makefile
的文件名不一定是
Makefile
,尽管推荐使用Makefile
这个名字。大多的Kbuild
文件的名字都是Makefile
。为了与其他Makefile
文件相区别,你也可以指定Kbuild Makefile
的名字为
Kbuild
。而且如果“Makefile
”和“Kbuild
”文件同时存在,则Kbuild
系统会使用“Kbuild
”文件。
obj-? = $(target).o
target
为编译对象的名字。如果没有指定xxx-objs
,这编译这个对象需要的源文件就是$(target).c
或$(target).s
。如果指定了$(target)-objs
,则编译这个对象需要的源文件由$(target)-objs
指定,并且不能有$(target).c
或$(target).s
文件。
有时候我们需要在内核源代码数的外面编译内核模块,编译的基本命令是:
我们可以把这个命令集成到Makefile
里,这样我们就可以只输入“make
”命令就可以了。回想上一章的那个Makefile
,它把Normal Makefile
和Kbuild Makefile
集成到一个文件中了。为了区别Kbuild Makefile
和Normal Makefile
,这样我们改写Makefile
为如下形式,并且添加Kbuild Makefile -
“Kbuild
”。
ifneq ($(KERNELRELEASE),)
include "Kbuild"
else
KERNEL_DIR = /lib/modules/`uname -r`/build
MODULEDIR := $(shell pwd)
.PHONY: modules
default: modules
modules:
make -C $(KERNEL_DIR) M=$(MODULEDIR) modules
clean distclean:
rm -f *.o *.mod.c .*.*.cmd *.ko
rm -rf .tmp_versions
endif
MODULE_NAME = helloworld
$(MODULE_NAME)-objs := hello.o
obj-m := $(MODULE_NAME).o
一般不需要在Makefile
里包含如下代码,
这样写完全是为了兼容老版本的Kbuild
系统。KERNELRELEASE
变量在Kernel Makefile
里定义的,因此只有在第二次由Kbuild
读取这个Makefile
文件时才会解析到Kbuild
的内容。
include "Kbuild"
else
...
endif
外部头文件
有时需要连接内核源代码外部的系统头文件,但Kbuild
系统默认的系统头文件都在内核源代码内部,如何使用外部的头文件呢?这个可以借助于Kbuild
系统的特殊规则:
EXTRA_CFLAGS += $(ext_include_path)
一般外部头文件可能位于外部模块源文件的目录内,如何指定呢?这可以借助$(src)
或$(obj)
因此,我们修改Kbuild
文件添加 EXTRA_CFLAGS
来包含外部头文件尽管在这个驱动里没有引用外部系统头文件:
MODULE_NAME = helloworld
$(MODULE_NAME)-objs := hello.o
EXTRA_CFLAGS := -I$(src)/include
obj-m := $(MODULE_NAME).o
· Goal definitions
Example:
obj-y += foo.o
告诉kbuild ,在文件夹中又一个叫做foo.o 的object 。foo.o 将会被从foo.c 或者foo.S 被构建。
如果foo.o 被构建成一个 模块 ,则将使用变量 obj-m 。 Example :
obj-$(CONFIG_FOO) += foo.o
$(CONFIG_FOO) 要么是y(built-in) 要么是m(module) 。如果CONFIG_FOO 既不是y 也不是m ,那么文件将不会被编译也不会被连接。
· Built-in object goals - obj-y
kbuild Makefiles 在 $(obj-y) 列表中为vmlinux 指明object 文件。这个列表依靠内核的配置。
在 $(obj-y) 中的文件的顺序是非常重要的。列表中允许两个相同的文件: 第一个 实体将被连接到built-in.o ,后面的实体将会 被忽略。
连接的顺序也很重要,因为在boot 过程中某些函数(module_init()/_initcall) 将会 按顺序出现。 因此,如果改变了连接顺序,将会改变你的SCSI 控制器的检测顺序,你的磁盘也同时被重新编号了。
Example:
#drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystem and device drivers.
# Each configuration option enables a list of files.
obj-$(CONFIG_ISDN) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
· Loadable module goals - obj-m
$(obj-m) 指明object 文件作为可装载的内核模块被构建。一个模块可能从一个或者多个源文件被构建。kbuild maefile 只是简单的将源文件加到%(obj-m)
Example:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
注意这里$(CONFIG_ISDN_PPP_BSDCOMP) 是m.
Note: In this example $(CONFIG_ISDN_PPP_BSDCOMP) evaluates to 'm' 。
如果一个内核模块从多个源文件构建,KBuild 就必须要知道你想从哪些部分构建模块。因此,你不得不设置 $(<module_name>-objs ) 变量来告诉KBuild 。
Example:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
在这个例子中,模块名是isdn.o,Kbuild 将会编译列在 $(isdn-objs) 的 object 文件,然后在这些文件的列表中调用"$(LD) -r" 来产生isdn.o 。
Kbuild 使用 后缀-objs,-y 来识别混合的object 文件。这允许Makefiles 使用变量 CONFIG_sambol 来决定一个object 是否是混合object 的的一部分。
Example:
#fs/ext2/Makefile
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
在这个例子中,如果$(CONFIG_EXT2_FS_XATTR)
是y
,则xattr.o
只是混合object
文件ext2.o
的一部分。
注意,当你构造一个objects 到内核中时,上面的语法当然也能够工作。因此,如果你让CONFIG_EXT2=Y,KBuild 将会为你构建一个独立的ext2.o 文件,并且连接到built-in.o 。
· Library file goals - lib-y
用 obj-* 连接的Objects 在指明的文件夹中被用作模块或者综合进built-in.o 。也又可能被列出的objects 将会被包含进一个库,lib.a 。所有用lib-y 列出的objects 在那个文件夹中被综合进单独的一个库。列在obj-y 和附加列在lib-y 中的Objects 将不会被包含在库中,因为他们将会被任意的存取。对于被连接在lib-m 中,连续的objects 将会被包含在lib.a 中。值得注意的是kbuild makefile 可能列出文件用作built-in ,并且作为库的一部分。因此,同一个文件夹可能包含一个built-in.o 和lib.a 文件。
Example:
#arch/i386/lib/Makefile
lib-y := checksum.o delay.o
这里讲会创建一个基于checksum.o 和delay.o 的库文件。对于kbuild ,识别一个lib.a 正在被构建,这个文件夹应该被列在 libs-y 中。 lib-y 的使用方法通常被限制在lib/ 和arc/*/lib 中。
· Descending down in directories
一个Makefile 只负责在他自己的文件夹中构建objects 。 在子文件夹中的文件应该由子文件夹中的Makefiles 来照顾。如果你知道他们,build 系统将会自动递归地用在子文件夹中的make 。
在这种情况下 obj-y 和 obj-m 就被使用了。ext2 存在于不同的文件夹中,Makefile 出现在fs/ ,则告诉kbuild 从后面的参数下来。
Example:
#fs/Makefile
obj-$(CONFIG_EXT2_FS) += ext2/
如果CONFIG_EXT2_FS 被设置成y(built-in) 或者m(modular) ,相应的obj- 变量将会被设置,并且kbuild 将会从ext2 文件夹继承下来。Kbuild 只会使用这些信息来决定它需要访问这些文件夹,而在子文件夹中的Makefile 来指明哪些是modules 哪些是built-in 。
当赋值文件夹名字的时候,使用CONFIG_variable 是很好的选择。这允许kbuild 完全的跳过文件夹,而不管CONFIG_option 是否是y 或者m 。
· Compilation flags
EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS 。
所有的EXTRA_ variables 只应用在kbuild 中,他们被赋值的地方。EXTRA_variables 应用在kbuild makefile 中所有的可执行的命令。 $(EXTRA_CFLAGS) 指明用$(CC) 编译C 文件的时候的选项。
Example:
# drivers/sound/emu10k1/Makefile
EXTRA_CFLAGS += -I$(obj)
ifdef DEBUG
EXTRA_CFLAGS += -DEMU10K1_DEBUG
endif
这里的变量是必须的,因为顶层的Makefile 拥有变量 $(CFLAGS) 并且用它来作为整个树的编译标志当编译汇编源文件的时候 $(EXTRA_AFLAGS) ,和每个文件夹的选项是相似的。
Example:
#arch/x86_64/kernel/Makefile
EXTRA_AFLAGS := -traditional
$(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS) 对于每个文件夹的$(LD) 和$(AR) 选项是类似的。
Example:
#arch/m68k/fpsp040/Makefile
EXTRA_LDFLAGS := -x
CFLAGS_$@, AFLAGS_$@
CFLAGS_$@ 和 AFLAGS_$@ 只应用到当前kbuild makefile 的命令。
$(CFLAGS_$@)
为每个文件的$(CC)
指明选项。
$@
部分有一个字面上的值,指明它是为那个文件。
Example:
# drivers/scsi/Makefile
CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF
CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
-DGDTH_STATISTICS
CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
These three lines specify compilation flags for aha152x.o,
gdth.o, and seagate.o
$(AFLAGS_$@) is a similar feature for source files in assembly
languages.
Example:
# arch/arm/kernel/Makefile
AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional
原文地址 http://blog.sina.com.cn/s/blog_48c1b149010002qj.html
发表评论
-
google pagespeed禁用改写html文件的cache头
2019-09-04 19:51 435这会禁用html文件的缓存,无法读取last-modifi ... -
macos 安装imagick解决php不能显示验证码的问题
2018-11-04 04:15 1157需要选安装pear,然后用pecl install imagi ... -
linux入侵检测
2018-07-07 22:58 639一、检查系统日志 l ... -
yii的安全策略
2018-07-06 04:02 400web根目录下.htaccess 写道 Options ... -
免费Web防火墙
2018-07-06 01:21 5591,modsecurity 基于apache 历史最悠久 ... -
两款免费好用的Web渗透工具
2018-07-06 01:12 9441,OWASP Zed Attack Proxy (ZAP ... -
apache2反向代理
2018-06-12 18:46 797开启以下两个模块 a2enmod proxy a2enm ... -
扩展Aws云主机磁盘大小
2018-03-05 21:17 1328进入ELASTIC BLOCK STORE-》卷 选中要修 ... -
ubuntu时区设置
2018-02-25 10:41 659查看当前时区 timedatectl 修改时区 dpk ... -
macos 10.13 dmg下载和安装盘制作
2018-02-05 19:58 9903https://bbs.feng.com/read-htm-t ... -
windows升级后 iis服务无效 IIS-W3SVC-WP 无法读取配置文件
2017-12-01 11:35 1555通过使用以管理员身份运行选项打开 Windows PowerS ... -
vmware中运行的macos连接iphone
2017-09-30 17:53 2233需要iphone插在usb2.0端口上,并且虚拟机usb兼容性 ... -
brotli压缩算法说明
2017-06-09 02:36 1226brotli是新一代的HTTP压缩算法,用于替代gzip,相 ... -
TCP Fast Open说明
2017-06-09 02:34 6996相关介绍 https://lwn.net/Article ... -
使用strongswan建立基于ikev2 eap-mschapv2的ipsec服务器
2017-04-17 23:14 3089sudo apt-get install strongsw ... -
使用strongswan/xl2tpd建立ipsec/l2tp服务器
2017-04-17 22:32 6034sudo apt-get install strongsw ... -
SecureFX中文件名乱码的解决
2014-08-28 03:23 3283原始贴子:https://forums.vandyke.c ... -
禁用htc one m7官方内核的写保护
2014-08-26 14:52 1247老外写的内核模块源码:https://github.com ... -
windows和office的kms激活方法(windows 企业版,office vl版可用)
2013-03-17 19:28 21windows 激活windows 8slmgr.vbs /i ... -
windows 8 64bit 离线官安装 .net framework 3.5
2013-01-23 11:32 1900因为国内网络问题不可能在线安装成功,所以就有了这么多麻烦。 ...
相关推荐
Kbuild系统使用Kbuild Makefile来编译内核或模块。当Kernel Makefile被解析完成后,Kbuild会读取相关的Kbuild Makefile进行内核或模块的编译。Kbuild Makefile有特定的语法指定哪些编译进内核中、哪些编译为模块、及...
linux下各平台的下的makefile文件与gnu makefile有一些不一样,这里作了详细分解,有好几个文件,把这个看会了,看linux下makefile不是问题
linux设备驱动makefile:2.4内核模块Makefile模板 #Makefile for linux2.4 KVER=$(shell uname -r) KDIR=/lib/modules/$(KVER)/build OBJS=mymodule.o CFLAGS=-D__KERNEL__ -I$(KDIR) /include -DMODULE
1.Linux内核配置方式 2.Kconfig 3.Kbuild Makefile 4.一个使用linux Kbuild实现可配置编译的例子
3.1节目标定义是一个快速的简介,下面的章节将会提供细节和例子 3.1 目标定义目标定义是kbuild Makefile的主要部分(核心) 3.2 内置目标 -
3.1节目标定义是一个快速的简介,下面的章节将会提供细节和例子 3.1 目标定义目标定义是kbuild Makefile的主要部分(核心) 3.2 内置目标 -
Kbuild系统实现分析,Kconfig和Makefile语法
为了学习Linux下的Makefile,从昨天开始决定要翻译一下源码底下/Documentation/kbuild目录下的modules.txt和Makefile.txt说明文档,今天翻译完,从网上找了篇别人的译文对比了下,感觉自己翻译的还算差强人意,所以...
多的资料(《嵌入式Linux应用开发完全手册》、Documentation/kbuild/makefiles.txt)已经向我们展示了一个初级Linux用户者应该懂得的知识--怎样添加需要编译的文件、添加编译的规则、多个源文件构成一个目标文件的...
COPYING Documentation MAINTAINERS README arch crypto fs init kernel mm scripts sound CREDITS Kbuild Makefile REPORTING-BUGS block drivers include ipc lib net security usr 进入block目录,用旁光看一下...
理解Kbuild有助于理解Linux的编译流程,对于Linux的体系架构理解起到事半功倍的作用
MAKEFILe 关于一个如何书写该类文件的说明
内核目录的documention/kbuild/makefiles.txt的中文翻译,快速入门还是有点帮助。
kbuild一般编译内核,当前这个工程用于控制编译应用程序,非常不错的例子
熟悉内核的 Makefile对开发设备驱动、理解内核代码结构都是非常重要的 linux2.6 内核 Makefile 的许多特性和 2.4 内核差别很大,在内核目录的documention/kbuild/makefiles.txt中有详细的说明
kernel2.6.x Makefile详解 linux2.6内核Makefile的许多特性和2.4内核差别很大,在内核目录的documention/kbuild/makefiles.txt中有详细的说明。 本文是中文翻译,方便学习
熟悉内核的Makefile对开发设备驱动、理解内核代码结构都是非常重要的! 在内核目录的documention/kbuild/makefiles.txt中有详细的说明。给大家一个中文版的翻译
Userland的Kbuild存储库模板 相同的代码库用于从超级计算机到超小型设备的不同范围的计算系统。 建库 没有粘合代码的更简单的makefile,很难读取和维护 减轻开发人员对代码依赖项管理的负担 一种简单高效的方法来...
我们可以通过分析它的Makefile入手。以下是一个简单的hello内核模块的Makefile. ifneq ($(KERNELRELEASE),) obj-m:=hello.o else KERNELDIR:=/lib/modules/$(shell uname -r)/build PWD:=$(shell pwd...
linux 2.6 内核 kbuild 文档。 讲述编译内核模块 makefile编写事项 老外写得,英文版