Yocto构建多源文件内核模块异常求助:缺失主文件符号及许可证信息
问题解决:Yocto构建多文件内核模块失败及许可证报错
1. 修正Makefile的模块定义错误
你当前的Makefile存在核心逻辑错误:当使用xxx-objs或xxx-y定义模块依赖的目标文件时,不能将模块主文件(my_nand_controller.o)加入依赖列表,内核构建系统会自动将主源文件(my_nand_controller.c)编译为目标文件,再与xxx-objs中的其他文件链接成最终的模块对象。
正确的Makefile写法如下:
obj-m := my_nand_controller.o # 仅列出除主文件外的其他依赖目标文件 my_nand_controller-objs := fpga_operations.o KERNEL_SRC := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules clean: $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean
也可使用-y后缀(与-objs效果一致,属于内核构建系统的兼容写法):
obj-m := my_nand_controller.o my_nand_controller-y := fpga_operations.o
错误原因解释
你之前的写法my_nand_controller-objs := my_nand_controller.o fpga_operations.o会让构建系统尝试将两个.o文件链接成my_nand_controller.o,但my_nand_controller.o本身已经由my_nand_controller.c编译生成,这会导致构建逻辑冲突,最终主文件的符号被忽略,仅保留了fpga_operations.o的内容。
2. 解决许可证缺失问题
内核模块必须声明合法的许可证,否则会触发内核污染提示,部分功能被禁用。只需在my_nand_controller.c的合适位置(比如文件末尾)添加以下代码:
#include <linux/module.h> // 声明许可证,根据模块实际情况选择,常用GPL MODULE_LICENSE("GPL"); // 可选:添加模块描述、作者等信息 MODULE_DESCRIPTION("Custom NAND Controller Module"); MODULE_AUTHOR("Your Name");
3. 验证修复效果
- 执行
make clean && make重新构建模块 - 使用
nm my_nand_controller.ko检查符号,确认my_nand_controller.c中的函数/变量符号已存在 - 使用
modinfo my_nand_controller.ko查看,应能看到license: GPL字段 - 加载模块
insmod my_nand_controller.ko,检查dmesg,不再出现许可证相关的报错
内容的提问来源于stack exchange,提问作者bLAZ
相关产品推荐
相关产品推荐

