EXPORT_SYMBOL 应用

·在模块函数定义之后使用EXPORT_SYMBOL(函数名)
·在调用该函数的模块中使用extern对之声明
·首先加载定义该函数的模块,再加载调用该函数的模块
mod1.c
*#include

#

mod2.c

static int func2(void)
{
extern int func1(void);
func1();
printk(“In Func: %s…/n”,func);
return 0;
}

static int __init hello_init(void)
{
printk(“Module 2,Init!/n”);
func2();
return 0;
}

static void __exit hello_exit(void)
{
printk(“Module 2,Exit!/n”);
}

module_init(hello_init);
module_exit(hello_exit);

注意:
在 2.6 以后的内核 ,EXPORT_SYMBOL(),将生成 Module.symvers 模块, 在调用此EXPORT_SYMBOL()的函数的驱动,将 Module.symvers文件放到 Makefile 同级目录下去编译,将顺利编译通过。
通俗的解析:
有两个我们自己的模块,其中Module B使用了Module A中的export的函数,因此在Module B的Makefile文件中必须添加:
KBUILD_EXTRA_SYMBOLS += /path/to/ModuleA/Module.symvers
export KBUILD_EXTRA_SYMBOLS
这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而导致编译得到的ko加载时也会出错。
需要注意的是:
(1)KBUILD_EXTRA_SYMBOLS 赋值时必须使用+=,而不能使用=及:=, (2)KBUILD_EXTRA_SYMBOLS 必须使用export处理一下

如果是内核中的函数,编译时不会生成 Module.symvers, 驱动.ko 文件直接调用 extern xxxxxx 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值