Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192353
  • 博文数量: 73
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1160
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 15:53
文章分类

全部博文(73)

文章存档

2011年(1)

2009年(72)

我的朋友

分类: LINUX

2009-04-30 14:12:55

内核 2.6.26 下的驱动模块 "Unknown symbol in module" 问题

(闭关修炼), 信区: Linux
  一个关于内核模块编写的问题
发信站瀚海星云 (2009年04月0900:02:31 星期四), 站内信件
 
想在内核中加点代码测试点东西,通过模块的方式进行测试,遇到了问题。
具体问题参见
 
他遇到的问题和我是一样的,网上并没有找到解答
我的内核版本是2.6.29.1
请问如何解决呢?

 

 

最简单的示例程序,写两个模块,分别为AB,在A中导出了一些函数,而在B中使用A导出的函数。模块都使用GPL
问题是在2.6.222.6.24下运行加载都很正常,当在2.6.26内核下加载时却出现了了Unknow symbol in module的错误。详见下面的具体描述。

两个模块的源码如下:

C/C++ code

 

// Module A (mod_a.c)

#include

#include

#include

 

static int func1(void)

{

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

       return 0;

}

 

// Export symbol func1

EXPORT_SYMBOL(func1);

 

static int __init hello_init(void)

{

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

       return 0;

}

 

static void __exit hello_exit(void)

{

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

}

 

module_init(hello_init);

module_exit(hello_exit);

 

 

C/C++ code

 

// Module B (mod_b.c)

#include

#include

#include

 

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);

 



Makefile for Module A

BatchFile code

 

obj-m += mod1.o

mod1-y := mod_a.o

 

KVERSION = $(shell uname -r)

 

all:

    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

   

clean:

    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

    rm -f *.o *.ko *.cmd

 



Makefile for Module B

BatchFile code

 

obj-m += mod2.o

mod2-y := mod_b.o

 

KVERSION = $(shell uname -r)

 

all:

    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

   

clean:

    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

    rm -f *.o *.ko *.cmd

 



编译完成后开始加载模块:

BatchFile code

 

#insmod ./mod1.ko

#insmod ./mod2.ko

FATAL: Error inserting mod2 (/home/user/test/mod2.ko): Unknown symbol in module, or unknown parameter (see dmesg)

#dmesg

[ 7029.008527] mod2: no symbol version for func1

[ 7029.008534] mod2: Unknown symbol func1

 



/proc/kallsyms 里可以找到module A导出的symbol
内核2.6.26版本以前都很正常,只有2.6.26版出现这个错误。请高手帮忙~谢谢

阅读(3079) | 评论(0) | 转发(0) |
0

上一篇:ifconfig

下一篇:NetLink详解

给主人留下些什么吧!~~