< insmod: ERROR: could not insert module GSM.ko: Unknown symbol in module. > How to fix it?

< insmod: ERROR: could not insert module GSM.ko: Unknown symbol in module. > How to fix it?

我写了一个简单的可加载内核模块。在 /dev/ 和相关的 class 目录中创建字符设备文件。我在项目中添加了以下几行。

MODULE_DESCRIPTION("GSM driver");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Guruprasad");
MODULE_DESCRIPTION("A simple driver");
MODULE_VERSION("0.1");

构建时我收到以下警告

WARNING: modpost: missing MODULE_LICENSE() in /home/.../char_dev_gsm/GSM.o

插入时出现以下错误:

insmod: ERROR: could not insert module GSM.ko: Unknown symbol in module

请帮我解决这个问题。

该项目有一个主文件 (GSM.c) 和一个包含文件 (device.c 和 device.h)

请从以下link获取文件。 https://github.com/guruprasad-92/Device-Driver

我尝试在文件 device.c 中添加 MODULE_LICENSE("Dual BSD/GPL"); 行,结果没有警告消息也没有错误消息,但是在插入模块时它既不创建设备文件 /dev/gsm0 也不会用 printk() 相关消息更新 $dmesg

我也尝试在文件 GSM.c 中编写函数 register_dev()unregister_dev() 但没有产生任何警告,并创建了设备 /dev/gsm0 和class 目录在 /sys/class/

但我想知道为什么文件包含在构建时发出警告。

主要问题是模块 GSM.ko 是从多个 .c 文件(GSM.c 和 device.c)构建的,模块的基本名称与.c 文件之一的基本名称(仅当模块是从单个 .c 文件构建时才允许)。

要修复它,您可以将 GSM.c 重命名为(例如)gsm.c 并更改 Makefile 中的 GSM-objs 行:

obj-m := GSM.o
GSM-objs = gsm.o device.o