Linux内核模块编译:makefile详解
需积分: 49 198 浏览量
更新于2024-09-01
收藏 19KB DOCX 举报
"内核态makefile指南:讲解如何编译Linux内核模块,包括编译进内核的模块和可加载模块的配置方法,以及处理多个文件依赖的编译规则。指南强调了编译选项的变化,如EXTRA_CFLAGS等变量的替换,并提供了一个最简单makefile的示例。"
在Linux内核开发中,`makefile`扮演着至关重要的角色,它负责编译和链接内核模块。内核态`makefile`的编写是确保模块正确构建的关键步骤。本指南聚焦于如何编写内核态`makefile`以支持模块的编译。
首先,有两种主要的编译模式:将模块编译进内核(`obj-y`)和编译成可加载模块(`obj-m`)。`obj-y`用于将模块静态编入内核镜像,而`obj-m`则用于创建可加载的`.ko`模块文件,这些文件可以在需要时动态加载到内核中。例如,`obj-y+=foo.o`会将`foo.o`编译进内核,而`obj-m+=foo.o`则会将其编译为可加载模块`foo.ko`。
如果一个模块依赖于多个源文件,可以使用类似`foo-y:=a.o b.o c.o`这样的指令,这告诉`make`程序`foo.o`是由`a.o`, `b.o`, `c.o`链接生成的。在实际编译过程中,`ld`工具的`-r`选项用于合并这些目标文件为单个模块。
在较新的内核版本中,编译选项已从`EXTRA_CFLAGS`, `EXTRA_AFLAGS`和`EXTRA_LDFLAGS`更改为`ccflags-y`, `asflags-y`和`ldflags-y`,分别对应于C编译器、汇编器和链接器的选项。这些变量允许开发者添加特定的编译和链接标志,以满足模块的特殊需求。
一个最简单的内核模块`makefile`如下所示:
```makefile
obj-m+=hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```
这个`makefile`将编译`hello.c`并生成`hello.ko`。`obj-m+=hello.o`声明了`hello.o`是一个可加载模块,`all`和`clean`目标分别用于编译和清理项目。`-C`选项指定使用内核源代码树中的`make`,而`M=$(PWD)`设置了当前工作目录,使得`make`能够找到模块的源文件。
`makefile`的自动推导功能在这里也得到了体现,即使没有明确指定`hello.c`,`make`也能自动寻找并编译它,只要该文件存在于同一目录下。这就是`makefile`的简洁和强大之处,它允许开发者专注于模块的功能实现,而不是编译过程的细节。
2021-11-04 上传
217 浏览量
点击了解资源详情
157 浏览量
139 浏览量
2007-07-18 上传
118 浏览量
110 浏览量
126 浏览量
@裸睡的猪@
- 粉丝: 2
- 资源: 17
最新资源
- ProfessionalPortfolio:包含未使用的文件或回收文件
- 易语言新用API置托盘图标成功1
- 03.GPRS功能测试.zip
- USTC_OS:此项目用于存储操作系统实验
- Python基于Django超市进销存销售管理系统设计毕业源码案例设计.zip
- 简笔涂鸦小功能实现
- 练习02.02-19.02:ПрактикаЕгоровСергейАндреевичИВТ1-1 02.02-19.02
- 易语言新BASE64编码速度测试
- protrip:一个Android应用程序,用于发现城市附近的酒店,餐厅和购物场所
- 02.LCD5110显示当前经纬度.zip
- 学习项目:在(重新)学习Web开发的同时完成了各种基于教程的项目
- 如何将COBOL记录类型迁移到MS SQL Server表2012中?
- 安居客python3按城市抓取小区数据.zip
- nest-server:提供Nest软件包的服务器
- Coursera_Capstone:Capstone项目使用Foursquare位置API来解决“邻里战役分析”。进行专业分析以比较相似的社区
- 大四毕业设计做的基于树莓派的人脸识别系统(调用百度云api).zip