Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
来源:互联网 发布:2个excel表格数据合并 编辑:程序博客网 时间:2024/05/17 09:18
Fedora:http://download.fedora.redhat.com/pub/
参考URL: http://blog.csdn.net/pottichu/archive/2007/11/19/1892203.aspx
环境: 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 SMPmod_unload 686 4KSTACKS '; 这一行的意思就是说,当前插入的模块xxx.ko的版本信息(versionmagic)与正运行的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 <linux/module.h>
/* 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:本方法并不是正规的解决办法,我是由于不想重新编译安装linuxkernel,并且能够确保当前源码树中的kernel版本与系统运行的kernel版本是相同的情况下采用的权宜之计。如果不能保证这一点,最好不要采用这种方法。以免产生一些莫名其妙的问题!!
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- 加载模块时 Error inserting -1 Invalid module format 错误
- Linux加载驱动"invalid module format"错误的一种可能解决办法
- ubuntu加载模块出现Invalid module format
- 驱动模块加载错误:insmod: can't insert 'xx.ko': invalid module format
- 插入内核模块失败提示"Invalid module format"
- 模块加载时 insmod “Invalid module format ”问题解决
- 内核文件加载时 -l Invalid module format
- linux 驱动开发 Invalid module format 错误解决方法
- linux 驱动开发 Invalid module format 错误解决方法
- insmod驱动模块 出现 Invalid module format
- 编译模块时遇到Invalid module format
- 加载模块是提示“insmod: error inserting 'helloworld.ko': -1 Invalid module format”
- insmod--invalid module format错误原因
- 公钥加密(不对称加密)
- SQL操作全集
- wsdl2java ( axis2 ) pom 文档
- SaaS架构成熟度模型
- ASP.NET MVC 入门5、View与ViewData
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- 利用tmail.exe 命令参数来发送邮件 (转自飞扬大哥BLOG)
- wsdl2java ( axis 1.4 ) pom 文档
- jquery 系列 二 获取选中的 chechbox 元素
- 中文输入法
- SaaS开创软件服务新模式
- ASP.NET 2.0中多页面表单的使用
- 林锐《大学十年》
- delete 和delete[]