You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 验证修复效果

  1. 执行make clean && make重新构建模块
  2. 使用nm my_nand_controller.ko检查符号,确认my_nand_controller.c中的函数/变量符号已存在
  3. 使用modinfo my_nand_controller.ko查看,应能看到license: GPL字段
  4. 加载模块insmod my_nand_controller.ko,检查dmesg,不再出现许可证相关的报错

内容的提问来源于stack exchange,提问作者bLAZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:12:34