obj-m += chrdev_node.o 是 Linux 内核模块 Makefile 中的核心指令,其作用是将 chrdev_node.c 源文件编译为内核模块(.ko 文件)。以下是分步解释:
1. 语法解析
obj-m:内核构建系统变量,表示要编译为可加载模块(Loadable Kernel Module, LKM) 的目标文件列表。+=:追加操作符,将右侧的值添加到obj-m列表中。chrdev_node.o:目标文件名(.o为对象文件扩展名),对应源文件chrdev_node.c。
2. 工作流程
- 源文件匹配:
- 内核构建系统会自动查找与
.o文件同名的.c源文件(即chrdev_node.c)。
- 内核构建系统会自动查找与
- 编译为对象文件:
- 将
chrdev_node.c编译为chrdev_node.o。
- 将
- 链接为模块:
- 将
chrdev_node.o链接为最终的内核模块chrdev_node.ko。
- 将
3. 关键规则
- 文件名必须一致:
.o文件名必须与源文件.c名称一致(扩展名不同)。- 错误示例:
obj-m += my_driver.o # 若源文件为 chrdev_node.c,则编译失败!
- 多文件模块:
- 若模块由多个源文件组成,需显式列出所有
.o文件:obj-m += my_module.o my_module-objs := file1.o file2.o # 指定组成模块的对象文件
- 若模块由多个源文件组成,需显式列出所有
4. 典型 Makefile 结构
# 指定内核源码目录(通常自动检测)
KDIR ?= /lib/modules/$(shell uname -r)/build
# 指定当前目录为模块源码目录
PWD := $(shell pwd)
# 定义模块目标(关键行!)
obj-m += chrdev_node.o
# 默认目标:编译模块
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
# 清理编译产物
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
5. 验证编译结果
- 生成
.ko文件:make ls *.ko # 应看到 chrdev_node.ko - 加载模块:
sudo insmod chrdev_node.ko dmesg | tail # 查看内核日志
6. 常见问题
- 文件名不匹配:
obj-m += driver.o # 若源文件为 chrdev_node.c,则报错:No rule to make target 'driver.o' - 源文件不在当前目录:
- 需通过
obj-m += ../path/to/chrdev_node.o指定路径(但通常建议将源文件放在模块目录下)。
- 需通过
7. 扩展知识
obj-yvsobj-m:obj-y:将代码编译为内核内建部分(不可卸载)。obj-m:将代码编译为可加载模块(通过insmod/modprobe动态加载)。
- 条件编译:
# 根据配置选择编译方式 obj-$(CONFIG_MY_DRIVER) += chrdev_node.o
总结
obj-m += chrdev_node.o 的核心作用是:将当前目录下的 chrdev_node.c 源文件编译为可加载的内核模块。务必确保 .o 文件名与源文件 .c 名称一致,这是内核构建系统自动匹配源文件的关键约定。
530

被折叠的 条评论
为什么被折叠?



