免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1803 | 回复: 0
打印 上一主题 下一主题

Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-26 17:52 |只看该作者 |倒序浏览

                                        Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法环境: vmware + fedora8;
             gcc version 4.1.2 20070925 (Red Hat 4.1.2-33);
             kernel source 用 kernel-2.6.23.1-42.fc8.src.rpm安装;
             uname -r 为 2.6.23.1-42.fc8;

题: 可以正常编译我写的驱动模块,但是加载(insmod)的时候提示错误: insmod: error inserting 'xxx.ko':
-1 Invalid module format;用# dmesg | tail 看到如下信息:xxx: version magic
'2.6.23.1 SMP mod_unload 686 4KSTACKS ' should be '2.6.23.1-42.fc8 SMP
mod_unload 686 4KSTACKS '; 这一行的意思就是说,当前插入的模块xxx.ko的版本信息(version
magic)与正运行的kernel的版本信息不一致!应该是2.6.23.1-42.fc8 SMP mod_unload 686 4KSTACKS,而实际上xxx.ko的版本信息却是:2.6.23.1 SMP mod_unload 686 4KSTACKS; 显然它们之间差别是很小的。实际上,根据上面安装的kernel源码来看,它们应该是没有什么差别的。 所以,下面采用了一种比较极端的方式,强制xxx.ko的版本信息与运行的kernel保持一致。
解决:
     修改/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/utsrelease.h文件中的宏定义
     #define UTS_RELEASE "2.6.23.1"
     为
     #define UTS_RELEASE "2.6.23.1-42.fc8"
     然后重新编译xxx.ko模块,这时候,它与内核的版本信息应该就是一致的了!试验下来确实如此,xxx.ko已经可以正常工作了!
   
     为什么是修改上面的宏定义呢?来看看/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/vermagic.h文件的内容吧!
     

#include

#include


/* Simply sanity version stamp for modules. */

#ifdef CONFIG_SMP

#define MODULE_VERMAGIC_SMP "SMP "

#else

#define MODULE_VERMAGIC_SMP ""

#endif

#ifdef CONFIG_PREEMPT

#define MODULE_VERMAGIC_PREEMPT "preempt "

#else

#define MODULE_VERMAGIC_PREEMPT ""

#endif

#ifdef CONFIG_MODULE_UNLOAD

#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "

#else

#define MODULE_VERMAGIC_MODULE_UNLOAD ""

#endif

#ifndef MODULE_ARCH_VERMAGIC

#define MODULE_ARCH_VERMAGIC ""

#endif


#define VERMAGIC_STRING                                                

        UTS_RELEASE " "                                                

        MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT                     

        MODULE_VERMAGIC_MODULE_UNLOAD MODULE_ARCH_VERMAGIC
     其中,VERMAGIC_STRING就是内核的版本信息,每个kernel module的版本信息就是从源代码树中的该宏定义获取的。所以,编译模块的时候一定要和实际使用该模块的内核的源代码树保持一致!不要张冠李戴,否则就会在加载模块的时候出现上述问题!
NOTES:
本方法并不是正规的解决办法,我是由于不想重新编译安装linux
kernel,并且能够确保当前源码树中的kernel版本与系统运行的kernel版本是相同的情况下采用的权宜之计。如果不能保证这一点,最好不要采
用这种方法。以免产生一些莫名其妙的问题!
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105004/showart_2079024.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP