linux驱动导出函数,Linux 驱动之EXPORT_SYMBOL 函数以及2.6内核 Unknown symbol bug解决办法...

1、Linux中EXPORT_SYMBOL的用法

EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。

//mod1.c

#include

#include

#include

MODULE_LICENSE("DUAL BSD/GPL");

int func1(void)

{

printk("In Func: %s.../n",__func__);

return 0;

}

static int __init hello_init(void)

{

printk("Module 1,Init!/n");

return 0;

}

static void __exit hello_exit(void)

{

printk("Module 1,Exit!/n");

}

EXPORT_SYMBOL(func1);

module_init(hello_init);

module_exit(hello_exit);//mod2.c

#include

#include

#include

MODULE_LICENSE("DUAL BSD/GPL");

extern int func1(void);

static int func2(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);

//Makefile

ifneq ($(KERNELRELEASE),)

obj-m := xxx.o

else

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:

rm -rf Module.symvers *.ko *.o *.mod.c .*.cmd .tmp_versions *~ *.*~

endif

2、 运行

有两个模块,mod1和mod2。

在mod1中定义了func()1函数,并且经EXPORT_SYMBOL()导出。

在mod2中extern func()1,调用func()1。

①insmod mod1.ko

②insmod mod2.ko

编译模块mod2,成功。

加载mod2时,输出:

insmod: error inserting ‘mod2.ko‘: -1 Invalid parameters

dmesg查看:

mod2: no symbol version for func

mod2: Unknown symbol func (err -22)

③cat/proc/kallsyms |grep func1

了解了什么是内核符号表之后,我们回到之前的问题。

我们查看/proc/kallsyms,发现mod1的func函数的标志为t,而此标志表示函数是局部的。

此问题是内核2.6.26之后版本的bug,并且不会被修复

3、解决办法

(1)把mod1的Module.symvers放到mod2中,这样在编译mod2时符号信息会自动链接进去。

(2)在mod2的Makefile中添加符号信息

echo ‘0x01873e3f        func  mod1 EXPORT_SYMBOL_GPL‘ > Module.symvers

这样mod2在编译时就知道mod1中func符号的地址。

Q:这个问题是由什么引起的呢?

A:生成mod2的时候不知道mod1中func的校验码,mod2加载时检查校验码出错。

在内核主线代码树的一个提交修改了内核挂载模块时的函数版本校验机制,使得在挂载模块时候对于编译

时个别函数没有确定CRC校验值无法通过check_version函数检查。

这是内核有意要禁止存在个别无版本校验信息的函数的模块挂载。

原文:http://blog.csdn.net/xy010902100449/article/details/46128645

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值