模块函数提供EXPORT_SYMBOL的问题
我先在有两个模块, module1, module2
module2中需要使用module1中的函数func1, 所以我在module1的最后加
EXPORT_SYMBOL_NOVERS(func1);
然后加载module1模块, 编译module2模块,
提示"explict definition for func1";
然后加载module2, 会卡死然后自动重新启动;
即使使用EXPORT_SYMBOL(func1); 也是会出现这个的问题
请指教问题出在哪里?...
------解决方案--------------------module2与module2编译一起,也就是一起加载,直接用.h文件说明就可以了
如果不是还要加上module2中加上extern func1()
------解决方案--------------------要使用EXPORT_SYMBOL的话需要在编译选项中-DEXPORT_SYMTAB
------解决方案--------------------对楼上兄弟说的很对,我错的,刚才做实验如下
insmod mod1.ko 必须先加载,因为函数体在他里面,再加载insmod mod2.ko就正常
编译选项中-DEXPORT_SYMTAB,同时要加上外部说明就少提示警告
下面简单代码:
/*mod1.c*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int He1(void)
{
printk(KERN_INFO "He1..\n");
return 0;
}
EXPORT_SYMBOL(He1);
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
==================================
/*mod2.c*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int He2(void)
{
extern int He1(void);
He1();
printk(KERN_INFO "He2..\n");
return 0;
}
static int __init hello_init(void)
{
He2();
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
### Makefile ---
## Author: hefuhua@163.com
## Version: $Id: Makefile,v 0.0 2007/01/26 02:02:51 leno Exp $
## Keywords:
## X-URL:
ifneq ($(KERNELRELEASE),)
obj-m := -DEXPORT_SYMTAB #加载该参数的地方
obj-m := mod2.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif