编剧驱动程序遇到问题。could not insert module hello.ko: Unknown symbol in module

mypint_skyman 2015-03-22 04:50:49
最近开始linux的驱动编程, 没想到诸多不顺利, 一开始连编辑器都不习惯, 现在使用vim了。
废话不多说。 代码如下

//---------------------hello.c

#include <linux/init.h>
#include <linux/module.h>
#include "mymax.h"

MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hellow world\n");
mymax();
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Good bye\n");
}

module_init(hello_init);
module_exit(hello_exit);



//------------------------mymax.c

#include <linux/init.h>
#include <linux/module.h>

#include "mymax.h"
MODULE_LICENSE("Dual BSD/GPL");

void mymax(void)
{
printk(KERN_ALERT "enter max\n")
}
EXPORT_SYMBOL(mymax);



//-----------------------mymax.h

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

void mymax(void);


//----------------------make file

obj-m := hello.o
module-objs := max.o
all:
make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD)
clean:
rm *.o *.ko


执行make以后, 确实产生了hello.ko
但是在sudo insmod hello.ko的时候出现了如下错误
insmod: ERROR: could not insert module hello.ko: Unknown symbol in module

用tail -f /var/log/syslog 可以看到[ 8631.274586] hello: Unknown symbol mymax (err 0)

网上找到一个说法是把被调用的Module.symvers放在主程序的makefile里,可是我这个编译完成以后一个Module.symvers啊。而且我的mymax.c并不是驱动模块文件, 编译后也不会有他自己的Module.symvers文件。 要怎么解决上面的问题啊。

...全文
1410 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫叶雪 2015-03-30
  • 打赏
  • 举报
回复
引用 13 楼 aningsk 的回复:
[quote=引用 8 楼 mypint_skyman 的回复:] [quote=引用 2 楼 aningsk 的回复:] 你的代码里虽然使用EXPORT_SYMBOL导出了符号,但是在使用此符号的文件里并没有extern。 看到你在mymax.h中加了函数声明 void mymax(void); 你在这一句前面添加extern就可以了。 另外,头文件里不用声明模块许可证,在c文件中加就可以了。
我把头文件mymax.h改成下面这个 还是 一样的问题啊。 能帮我看看吗 #include <linux/init.h> #include <linux/module.h> extern void mymax(void); [/quote] 你可以试试这样写: 文件main.c #include <...> #include "mymax.h" XXX_init() {...} XXX_exit() {...} module_init(...) module_exit(...) MODULE_LIENCE(...) 文件mymax.h extern void mymax(void); (这一句就行了) 文件mymax.c void mymax(void) {....} 文件Makefile KVERS = $(shell uname -r) obj-m += module_name.o module_name-objs := main.o mymax.o build: kernel_modules kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean[/quote] mymax.c我上面忘了EXPOER,还有许可证。。。
枫叶雪 2015-03-30
  • 打赏
  • 举报
回复
引用 8 楼 mypint_skyman 的回复:
[quote=引用 2 楼 aningsk 的回复:] 你的代码里虽然使用EXPORT_SYMBOL导出了符号,但是在使用此符号的文件里并没有extern。 看到你在mymax.h中加了函数声明 void mymax(void); 你在这一句前面添加extern就可以了。 另外,头文件里不用声明模块许可证,在c文件中加就可以了。
我把头文件mymax.h改成下面这个 还是 一样的问题啊。 能帮我看看吗 #include <linux/init.h> #include <linux/module.h> extern void mymax(void); [/quote] 你可以试试这样写: 文件main.c #include <...> #include "mymax.h" XXX_init() {...} XXX_exit() {...} module_init(...) module_exit(...) MODULE_LIENCE(...) 文件mymax.h extern void mymax(void); (这一句就行了) 文件mymax.c void mymax(void) {....} 文件Makefile KVERS = $(shell uname -r) obj-m += module_name.o module_name-objs := main.o mymax.o build: kernel_modules kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
mypint_skyman 2015-03-28
  • 打赏
  • 举报
回复
引用 4 楼 Hacker_NO_1 的回复:
先安装mymax.ko ,hello模块需要引用mymax中的函数,必须先把依赖的模块安装到内核中
我这么多C文件 编译后 只有一个ko文件。 不是一个C文件 就编译出一个ko文件的
mypint_skyman 2015-03-28
  • 打赏
  • 举报
回复
引用 2 楼 aningsk 的回复:
你的代码里虽然使用EXPORT_SYMBOL导出了符号,但是在使用此符号的文件里并没有extern。 看到你在mymax.h中加了函数声明 void mymax(void); 你在这一句前面添加extern就可以了。 另外,头文件里不用声明模块许可证,在c文件中加就可以了。
我把头文件mymax.h改成下面这个 还是 一样的问题啊。 能帮我看看吗 #include <linux/init.h> #include <linux/module.h> extern void mymax(void);
mypint_skyman 2015-03-28
  • 打赏
  • 举报
回复
引用 1 楼 zlw1005 的回复:
好好看看别人的驱动文件时怎么写的 makfile 中 obj-m := hello.o module-objs := max.o ?????先写一个简单的单独一个文件的
你好, 一个文件我知道如何编译, 就是特别想要知道多个文件怎么搞啊
mypint_skyman 2015-03-28
  • 打赏
  • 举报
回复
引用 10 楼 zlw1005 的回复:
[quote=引用 7 楼 mypint_skyman 的回复:] [quote=引用 1 楼 zlw1005 的回复:] 好好看看别人的驱动文件时怎么写的 makfile 中 obj-m := hello.o module-objs := max.o ?????先写一个简单的单独一个文件的
你好, 一个文件我知道如何编译, 就是特别想要知道多个文件怎么搞啊[/quote] obj-m 和module-objs建议你去查下,不懂的参数就百度,多尝试,你的源文件其实写的有些问题,你多改改,下面好多人给你解释了[/quote] 这个问题今天周末 有空看了下, 解掉了。 无奈又 遇到一个问题 http://bbs.csdn.net/topics/391005609
mypint_skyman 2015-03-28
  • 打赏
  • 举报
回复
引用 3 楼 GuoQun01 的回复:
应该是这个样子吧?我不太确定: hello-objs := mymax.o
你的答案 是对啊, 给分, 但是有编译成功后 printk 的log 无法看到 (tail -f /var/log/syslog), 等会请看我的另一个帖子http://bbs.csdn.net/topics/391005609
happy小文字 2015-03-28
  • 打赏
  • 举报
回复
引用 7 楼 mypint_skyman 的回复:
[quote=引用 1 楼 zlw1005 的回复:] 好好看看别人的驱动文件时怎么写的 makfile 中 obj-m := hello.o module-objs := max.o ?????先写一个简单的单独一个文件的
你好, 一个文件我知道如何编译, 就是特别想要知道多个文件怎么搞啊[/quote] obj-m 和module-objs建议你去查下,不懂的参数就百度,多尝试,你的源文件其实写的有些问题,你多改改,下面好多人给你解释了
fly 100% 2015-03-25
  • 打赏
  • 举报
回复
编译module的时候应该设置makefile的时候少设置了kernel的路径 导致依赖不完整
李迟 2015-03-25
  • 打赏
  • 举报
回复
楼上说的基本是Makefile的问题,楼主的这个的确要改善一下。网上有很多资料。 另外有一点要注意的,你编译的驱动ko所用的内核源码,和你现在的系统内核最好一致。 我以前遇到过这类情况,楼主可以参考一下。
Hacker_NO_1 2015-03-23
  • 打赏
  • 举报
回复
先安装mymax.ko ,hello模块需要引用mymax中的函数,必须先把依赖的模块安装到内核中
happy小文字 2015-03-23
  • 打赏
  • 举报
回复
好好看看别人的驱动文件时怎么写的 makfile 中 obj-m := hello.o module-objs := max.o ?????先写一个简单的单独一个文件的
小听风 2015-03-23
  • 打赏
  • 举报
回复
应该是这个样子吧?我不太确定: hello-objs := mymax.o
枫叶雪 2015-03-23
  • 打赏
  • 举报
回复
你的代码里虽然使用EXPORT_SYMBOL导出了符号,但是在使用此符号的文件里并没有extern。 看到你在mymax.h中加了函数声明 void mymax(void); 你在这一句前面添加extern就可以了。 另外,头文件里不用声明模块许可证,在c文件中加就可以了。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧