模块函数提供EXPORT_SYMBOL的问题

zjuylok 2007-09-10 09:47:08
我先在有两个模块, module1, module2

module2中需要使用module1中的函数func1, 所以我在module1的最后加

EXPORT_SYMBOL_NOVERS(func1);

然后加载module1模块, 编译module2模块,

提示"explict definition for func1";

然后加载module2, 会卡死然后自动重新启动;

即使使用EXPORT_SYMBOL(func1); 也是会出现这个的问题

请指教问题出在哪里?...
...全文
3795 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
teamos 2012-01-10
  • 打赏
  • 举报
回复
感谢楼上.
hefuhua 2007-09-10
  • 打赏
  • 举报
回复
对楼上兄弟说的很对,我错的,刚才做实验如下

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

zjuylok 2007-09-10
  • 打赏
  • 举报
回复
编译选项已加...
hzcpig 2007-09-10
  • 打赏
  • 举报
回复

要使用EXPORT_SYMBOL的话需要在编译选项中-DEXPORT_SYMTAB
zjuylok 2007-09-10
  • 打赏
  • 举报
回复
更正一下, 我使用EXPORT_SYMBOL(func1)不会卡死, 然后重新启动;

而是在加载module2是提示: "unresolve symbol func1";

这说明我在module2中调用的外部函数func1对module2是不可见的,

但是/proc/ksyms中却是有 func1_R__ver_func1, 这应该是版本控制后的func1函数在内核符号表中的名字

难道要我直接调用func1_R__ver_func1 ? ... 这不对吧...
zjuylok 2007-09-10
  • 打赏
  • 举报
回复
加上extern func1也不行, 问题好像是这样的:

module1中声明的func1函数在 cat /proc/ksyms可以看到,

名字是: func1_R_ver_func1

而我在module2中调用的是func1函数...
hefuhua 2007-09-10
  • 打赏
  • 举报
回复
module2与module2编译一起,也就是一起加载,直接用.h文件说明就可以了

如果不是还要加上module2中加上extern func1()

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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