Linux内核模块编译:makefile详解
需积分: 49 176 浏览量
更新于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 上传
2011-05-27 上传
2024-11-01 上传
2024-11-01 上传
2024-11-01 上传
@裸睡的猪@
- 粉丝: 2
- 资源: 17
最新资源
- IEEE 14总线系统Simulink模型开发指南与案例研究
- STLinkV2.J16.S4固件更新与应用指南
- Java并发处理的实用示例分析
- Linux下简化部署与日志查看的Shell脚本工具
- Maven增量编译技术详解及应用示例
- MyEclipse 2021.5.24a最新版本发布
- Indore探索前端代码库使用指南与开发环境搭建
- 电子技术基础数字部分PPT课件第六版康华光
- MySQL 8.0.25版本可视化安装包详细介绍
- 易语言实现主流搜索引擎快速集成
- 使用asyncio-sse包装器实现服务器事件推送简易指南
- Java高级开发工程师面试要点总结
- R语言项目ClearningData-Proj1的数据处理
- VFP成本费用计算系统源码及论文全面解析
- Qt5与C++打造书籍管理系统教程
- React 应用入门:开发、测试及生产部署教程