没有合适的资源?快使用搜索试试~ 我知道了~
首页LINUX2.6内核makefile详解
LINUX2.6内核makefile详解
需积分: 10 35 下载量 187 浏览量
更新于2023-03-03
评论
收藏 143KB DOC 举报
本文档主要讲解linux2.6内核的makefile的写法,适合初学者、需要写内核makefile(驱动的makefile)看。
资源详情
资源评论
资源推荐
linux2.6 内核 Makefile 详解
熟悉内核的 Makefile 对开发设备驱动、理解内核代码结构都是非常重要的
linux2.6 内核 Makefile 的许多特性和 2.4 内核差别很大,在内核目录的 documention/kbuild/
makefiles.txt 中有详细的说明。给大家一个中文版的翻译
=== 目录
=== 1 概述
=== 2 用户与作用
=== 3 Kbuild 文件
--- 3.1 目标定义
--- 3.2 编译进内核 - obj-y
--- 3.3 编译可装载模块 - obj-m
--- 3.4 输出的符号
--- 3.5 目标库文件 - lib-y
--- 3.6 递归躺下访问目录
--- 3.7 编辑标志
--- 3.8 命令行的依赖关系(原文中没有写:-))
--- 3.9 跟踪依赖
--- 3.10 特殊规则
--- 3.11 $(CC) 支持的函数
=== 4 本机程序支持
--- 4.1 简单的本机程序
--- 4.2 复合的本机程序
--- 4.3 定义共享库
--- 4.4 使用用 C++编写的本机程序
--- 4.5 控制本机程序的编译选项
--- 4.6 编译主机程序时
--- 4.7 使用 hostprogs-$(CONFIG_FOO)
=== 5 Kbuild 清理
=== 6 架构 Makefile
--- 6.1 调整针对某一具体架构生成的镜像
--- 6.2 将所需文件加到 archprepare 中
--- 6.3 递归下向时要访问的目录列表
--- 6.4 具体架构的启动镜像
--- 6.5 构造非 Kbuild 目标
--- 6.6 构建启动镜像的命令
--- 6.7 Kbuild 自定义命令
--- 6.8 联接器预处理脚本
=== 7 Kbuild 变量
=== 8 Makefile 语言
=== 9 关于作者
=== 10 TODO
=== 1 概述
Linux 内核的 Makefile 分为 5 个部分:
Makefile 顶层 Makefile
.config 内核配置文件
arch/$(ARCH)/Makefile 具体架构的 Makefile
scripts/Makefile.* 通用的规则等。面向所有的 Kbuild Makefiles。
kbuild Makefiles 内核源代码中大约有 500 个这样的文件
顶层 Makefile 阅读的.config 文件,而该文件是由内核配置程序生成的。
顶层 Makefile 负责制作:vmlinux(内核文件)与模块(任何模块文件)。制作的过程主要是
通过递归向下访问子目录的形式完成。并根据内核配置文件确定访问哪些子目录。顶层
Makefile 要原封不动的包含一具体架构的 Makefile,其名字类似于 arch/$(ARCH)/
Makefile。该架构 Makefile 向顶层 Makefile 提供其架构的特别信息。
每一个子目录都有一个 Kbuild Makefile 文件,用来执行从其上层目录传递下来的命令。
Kbuild Makefile 从.config 文件中提取信息,生成 Kbuild 完成内核编译所需的文件列表。
scripts/Makefile.*包含了所有的定义、规则等信息。这些文件被用来编译基于 kbuild
Makefile 的内核。(**有点不通**)
=== 2 用户与作用
可以将人们与内核 Makefile 的关系分成 4 类。
*使用者* 编译内核的人。他们只是键入"make menuconfig"或"make"这样的命令。一般
情况下是不会读或编辑任何内核 Makefile(或者任何的源文件)。
*普通开发人员* 这是一群工作在内核某一功能上的人,比如:驱动开发,文件系统或
网络协议。他们所需要维护的只是他们所工作的子系统的 Kbuild Makefile。为了提高
工作的效率,他们也需要对内核 Makefile 有一个全面的认识,并且要熟悉 Kbuild 的接口
。
*架构开发人员* 这是一些工作在具体架构,比如 sparc 或者 ia64,上面的人。架构开
发者需要在熟悉 kbuild Makefile 的同时,也要熟悉他所工作架构的 Makefile。
*Kbuild 开发者* 维护 Kbuild 系统的人。他们需要知晓内核 Makefile 的方方面面。
该文件是为普通开发人员与架构开发人员所写。
=== 3 Kbuild 文件
大部分内核中的 Makefile 都是使用 Kbuild 组织结构的 Kbuild Makefile。这章介绍了
Kbuild Makefile 的语法。
Kbuild 文件倾向于"Makefile"这个名字,"Kbuild"也是可以用的。但如果"Makefile"
"Kbuild"同时出现的话,使用的将会是"Kbuild"文件。
3.1 节 目标定义是一个快速介绍,以后的几章会提供更详细的内容以及实例。
--- 3.1 目标定义
目标定义是 Kbuild Makefile 的主要部分,也是核心部分。主要是定义了要编
译的文件,所有的选项,以及到哪些子目录去执行递归操作。
最简单的 Kbuild makefile 只包含一行:
例子:
obj-y += foo.o
该例子告诉 Kbuild 在这目录里,有一个名为 foo.o 的目标文件。foo.o 将从 foo.c
或 foo.S 文件编译得到。
如果 foo.o 要编译成一模块,那就要用 obj-m 了。所采用的形式如下:
例子:
obj-$(CONFIG_FOO) += foo.o
$(CONFIG_FOO)可以为 y(编译进内核) 或 m(编译成模块)。如果 CONFIG_FOO 不是 y
和 m,那么该文件就不会被编译联接了。
--- 3.2 编译进内核 - obj-y
Kbuild Makefile 规定所有编译进内核的目标文件都存在$(obj-y)列表中。而
这些列表依赖内核的配置。
Kbuild 编译所有的$(obj-y)文件。然后,调用"$(LD) -r"将它们合并到一个
build-in.o 文件中。稍后,该 build-in.o 会被其父 Makefile 联接进 vmlinux 中。
$(obj-y)中的文件是有顺序的。列表中有重复项是可以的:当第一个文件被联
接到 built-in.o 中后,其余文件就被忽略了。
联接也是有顺序的,那是因为有些函数(module_init()/__initcall)将会在启
动时按照他们出现的顺序进行调用。所以,记住改变联接的顺序可能改变你
SCSI 控制器的检测顺序,从而导致你的硬盘数据损害。
例子:
#drivers/isdn/i4l/Makefile
&n
bsp; # 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
--- 3.3 编译可装载模块 - obj-m
$(obj-m) 列举出了哪些文件要编译成可装载模块。
一个模块可以由一个文件或多个文件编译而成。如果是一个源文件,Kbuild
Makefile 只需简单的将其加到$(obj-m)中去就可以了。
例子:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
注意:此例中 $(CONFIG_ISDN_PPP_BSDCOMP) 的值为'm'
如果内核模块是由多个源文件编译而成,那你就要采用上面那个例子一样的
方法去声明你所要编译的模块。
Kbuild 需要知道你所编译的模块是基于哪些文件,所以你需要通过变量
$(<module_name>-objs)来告诉它。
例子:
#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)中列出的
所有文件,然后使用"$(LD) -r"生成 isdn.o。
Kbuild 能够识别用于组成目标文件的后缀-objs 和后缀-y。这就让 Kbuild
Makefile 可以通过使用 CONFIG_ 符号来判断该对象是否是用来组合对象的。
例子:
#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 将是复合
对象 ext2.o 的一部分。
注意:当然,当你要将其编译进内核时,上面的语法同样适用。所以,如果
你的 CONFIG_EXT2_FS=y,那 Kbuild 会按你所期望的那样,生成 ext2.o 文件
,然后将其联接到 built-in.o 中。
--- 3.4 输出的符号
在 Makefile 中,没有对模块输出的符号有特殊要求。
--- 3.5 目标库文件 - lib-y
在 obj-* 中所列文件是用来编译模块或者是联接到特定目录中的 built-in.o
。同样,也可以列出一些将被包含在 lib.a 库中的文件。
在 lib-y 中所列出的文件用来组成该目录下的一个库文件。
在 obj-y 与 lib-y 中同时列出的文件,因为都是可以访问的,所以该文件是
不会被包含在库文件中的。
同样的情况, lib-m 中的文件就要包含在 lib.a 库文件中。
注意,一个 Kbuild makefile 可以同时列出要编译进内核的文件与要编译成库
的文件。所以,在一个目录里可以同时存在 built-in.o 与 lib.a 两个文件。
例子:
#arch/i386/lib/Makefile
lib-y := chechsum.o delay.o
这将由 checksum.o 和 delay.o 两个文件创建一个库文件 lib.a。为了让
Kbuild 真正认识到这里要有一个库文件 lib.a 要创建,其所在的目录要加
到 libs-y 列表中。
还可参考"6.3 递归下向时要访问的目录列表"
lib-y 使用一般限制在 lib/ 和 arch/*/lib 中。
--- 3.6 递归向下访问目录
一个 Makefile 只对编译所在目录的对象负责。在子目录中的文件的编译要由
其所在的子目录的 Makefile 来管理。只要你让 Kbuild 知道它应该递归操作,
那么该系统就会在其子目录中自动的调用 make 递归操作。
剩余23页未读,继续阅读
cqcyit16
- 粉丝: 33
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0