日期:2014-05-16  浏览次数:20812 次

模块函数提供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