当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2016-05-13

    本文导语:  最简单的示例程序,写两个模块,分别为A和B,在A中导出了一些函数,而在B中使用A导出的函数。模块都使用GPL。 问题是在2.6.22和2.6.24下运行加载都很正常,当在2.6.26内核下加载时却出现了了Unknow symbol in module的错...

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

两个模块的源码如下:

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



// 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
[code=BatchFile]
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
[/code]

Makefile for Module B
[code=BatchFile]
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
[/code]

编译完成后开始加载模块:
[code=BatchFile]
#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
[/code]

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

|
这是linux kernel 2.6.26 之后版本的bug (详细描述, 请看http://bugzilla.kernel.org/show_bug.cgi?id=12446)
并且这个bug不会被fix

解决办法是把mod_a的Module.symvers放到mod_b的当前路径,从而编译mod_b,符号信息会自动连接进去.
或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers

编译mod_b时,搜索Module.symvers的路径是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路径, 它等效于变量KBUILD_EXTMOD的值
3, 变量KBUILD_EXTRA_SYMBOLS的值

    
 
 

您可能感兴趣的文章:

  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • 内核模块跟内核版本不匹配????????
  • [求教]内核加载模块后,这部分内容编译在内核里的吗?
  • 谁能提供kgdb内核补丁内核模块的下载
  • 驱动模块可以编入内核,想单独编译成模块,makefile怎么写?
  • 大侠帮忙!模块调试(非内核模块)
  • 想删除内核中的一个模块,输入命令后,系统提示该模块不存在。但是我lsmod时,它在/proc/modules中。求解。
  • 求内核和用户态简单易行的通信方法,用户态只需得到一个内核模块参数
  • 内核模块是什么东西,怎么理解呢
  • Linux 内核模块编程问题!!!!
  • 内核模块和设备驱动的区别?
  • 怎么给内核加载自己编写的模块
  • 自定义内核模块禁止启动图形界面
  • 内核模块的问题
  • 升级内核之后,模块加载问题
  • 模块如何被内核调用的?
  • linux内核中网络模块的学习
  • 如何想向内核添家一个自定义的模块?
  • rndis驱动编译成内核模块
  • 内核模块编程打印进程信息
  • 重新编译内核启动后报错Kernel Panic on VFS: Unable to mount root fs on unknown-block(0,0)
  • linux内核升级问题:Kernel panic: VFS Unable to mount root fs on unknown-block(8-3)
  • linux内核升级出现错误:vfs cannot open root device sda2 or unknown-block 0 0
  • 加入yaffs2,编译内核显示error: unknown field `prepare_write' specified in initializer
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • Linux中内核线程不访问内核态地址空间?
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 编译新内核后怎么进入原来内核
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • docker使用的技术之Container内核原理介绍
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 不重新编译内核能修改内核函数吗?
  • 如何学好内核?学了内核能应用于哪方面?
  • 请问在2.6的内核环境下编译2.4的内核有没有什么特殊的要求


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3