Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
16lz
2021-01-22
参考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 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<linux/utsrelease.h>
#include<linux/module.h>
/*Simplysanityversionstampformodules.*/
#ifdefCONFIG_SMP
#defineMODULE_VERMAGIC_SMP " SMP "
#else
#defineMODULE_VERMAGIC_SMP ""
#endif
#ifdefCONFIG_PREEMPT
#defineMODULE_VERMAGIC_PREEMPT " preempt "
#else
#defineMODULE_VERMAGIC_PREEMPT ""
#endif
#ifdefCONFIG_MODULE_UNLOAD
#defineMODULE_VERMAGIC_MODULE_UNLOAD " mod_unload "
#else
#defineMODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndefMODULE_ARCH_VERMAGIC
#defineMODULE_ARCH_VERMAGIC ""
#endif
#defineVERMAGIC_STRING
UTS_RELEASE " "
MODULE_VERMAGIC_SMPMODULE_VERMAGIC_PREEMPT
MODULE_VERMAGIC_MODULE_UNLOADMODULE_ARCH_VERMAGIC
环境: 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<linux/utsrelease.h>
#include<linux/module.h>
/*Simplysanityversionstampformodules.*/
#ifdefCONFIG_SMP
#defineMODULE_VERMAGIC_SMP " SMP "
#else
#defineMODULE_VERMAGIC_SMP ""
#endif
#ifdefCONFIG_PREEMPT
#defineMODULE_VERMAGIC_PREEMPT " preempt "
#else
#defineMODULE_VERMAGIC_PREEMPT ""
#endif
#ifdefCONFIG_MODULE_UNLOAD
#defineMODULE_VERMAGIC_MODULE_UNLOAD " mod_unload "
#else
#defineMODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndefMODULE_ARCH_VERMAGIC
#defineMODULE_ARCH_VERMAGIC ""
#endif
#defineVERMAGIC_STRING
UTS_RELEASE " "
MODULE_VERMAGIC_SMPMODULE_VERMAGIC_PREEMPT
MODULE_VERMAGIC_MODULE_UNLOADMODULE_ARCH_VERMAGIC
更多相关文章
- MySQL5.5.22版本安装配置以及基本命令的使用和管理数据库备份与
- pymysql实现从a表过滤出有效信息添加至b表
- Mysql5.7.10版本安装后空密码登录,退出后提示密码错误连接不上解
- SQL查出比经理薪水还高的员工信息:
- MySQL5.7.11版本,64位绿色版安装
- 要查询选修了所有课程的学生信息,怎样用sql实现?
- 在线求助.Select语句包含ERP单据内表头与表身信息
- 用delphi5修改sql server2000出现“键列信息不足,更因影响太多的
- 如何使用来自其他模型的信息来注释查询集,或者在Django Rest Fram