Linux 驱动之 EXPORT_SYMBOL 函数以及 2.6 内核 Unknown symbol bug 解决办法
来源:互联网 发布:淘宝刷评给礼品微信号 编辑:程序博客网 时间:2024/06/06 02:05
1、Linux中EXPORT_SYMBOL的用法
EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。
//mod1.c
#include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h>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<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
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.oelseKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default:$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesclean: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函数检查。
这是内核有意要禁止存在个别无版本校验信息的函数的模块挂载。
- Linux 驱动之 EXPORT_SYMBOL 函数以及 2.6 内核 Unknown symbol bug 解决办法
- linux加载ko时出现Unknown symbol 错误(调用了EXPORT_SYMBOL出来的函数)
- 导出内核符号 EXPORT_SYMBOL insmod: error inserting 'mod2.ko': -1 Unknown symbol in module
- linux内核插入模块时 Unknown symbol in module
- linux-2.6.38.8+rtai3.9 编译提示unknown symbol irq_desc 解决办法
- 关于linux内核中的EXPORT_SYMBOL
- 浅析linux内核中的EXPORT_SYMBOL()
- linux KO使用内核export_symbol
- linux内核驱动调试bug解读
- 加载内核模块-Unknown symbol错误分析
- 加载内核模块-Unknown symbol错误分析
- 加载内核模块-Unknown symbol错误分析
- 加载网卡驱动,显示Unknown symbol netpoll_trap
- Linux内核gprof与insmod模块报Unknown symbol __gnu_mcount_nc (err 0)
- Linux内核中EXPORT_SYMBOL的用法
- EXPORT_SYMBOL linux的内核符号表
- Linux内核中EXPORT_SYMBOL的用法
- Linux内核—EXPORT_SYMBOL宏的使用
- java内部类的一些细节
- java方法重载和重写
- hdu2588GCD
- hdu-2196 Computer
- 2015-5-28碎碎念
- Linux 驱动之 EXPORT_SYMBOL 函数以及 2.6 内核 Unknown symbol bug 解决办法
- HDU 5242 Game 上海大都会赛 G题
- 3-42
- day2
- 【数据结构】顺序队列的实现(c++)
- 北京络捷斯特第三方物流信息系统技术解析(三) 订单录入-出库订单
- 题目1522:包含min函数的栈
- Ubuntu 14.04用户修改更新源和替换软件源的方法
- 待修改P124.41