insmod hello.ko -1 Invalid module format最简单的解决的方法

在下也是从网上搜索到的这样的解决的方法。

遇到这样的情况后,通过dmesg看一下内核日志。

假设发现有例如以下日志。那就好办了。

hello: version magic ‘2.6.33.3 ‘ should be ‘2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 ‘

改动内核源代码文件include/linux/vermagic.h

把例如以下VERMAGIC_STRING宏的定义删掉

#define VERMAGIC_STRING
\

UTS_RELEASE " "\

MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT
\

MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS\

MODULE_ARCH_VERMAGIC

然后,从新定义一个VERMAGIC_STRING宏

#define VERMAGIC_STRING  "should be ‘2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 "

注意,双引號中的内容,要与dmesg输出的日志中should be后面的单引號中的内容,全然同样。别漏掉了那个空格哦。

好了,如今又一次编译一下你的模块,再载入一次吧。

基本上应该会OK啦。

须要指出的是,这样的方法非常不正规。

假设你仅仅是急于开发验证模块,不想又一次编译安装新内核,能够暂时使用一下。

并且,用的时候,也要注意一下,模块编译所用的内核版本号与实际执行的内核版本号。

大体上也要比較接近才行。否则可能会出问题的。

假设是正式的产品。请务必保证。模块是基于实际执行的内核编译出来的。

好了。问题攻克了。以下再闲说几句模块的载入。

实际上。Linux下模块的载入。是通过系统调用sys_init_module完毕的。

对于2.6的内核。sys_init_module的代码在kernel/module.c中

sys_init_module调用load_module,load_module则检查模块的vermagic是否与内核的一样。

modmagic = get_modinfo(sechdrs, infoindex, "vermagic");

/* This is allowed: modprobe --force will invalidate it. */

if (!modmagic) {

tainted |= TAINT_FORCED_MODULE;

printk(KERN_WARNING "%s: no version magic, tainting kernel.\n",

mod->name);

} else if (!same_magic(modmagic,vermagic)) {

printk(KERN_ERR "%s: version magic ‘%s‘ should be ‘%s‘\n",

mod->name, modmagic, vermagic);

err = -ENOEXEC;

goto free_hdr;

}

vermagic是内核中保存的magic。其定义例如以下。可见他的值也就来自于我们上面定义的宏。

static const char vermagic[] = VERMAGIC_STRING;

除了检查vermagic。load_module还会检查模块的许可证的兼容性,

详细调用链是:load_module->set_license->license_is_gpl_compatible

从以下license_is_gpl_compatible的代码,能够看出内核支持的许可证类型。

static inline int license_is_gpl_compatible(const char *license)

{

return (strcmp(license, "GPL") == 0

|| strcmp(license, "GPL v2") == 0

|| strcmp(license, "GPL and additional rights") == 0

|| strcmp(license, "Dual BSD/GPL") == 0

|| strcmp(license, "Dual MIT/GPL") == 0

|| strcmp(license, "Dual MPL/GPL") == 0);

}

因此,我们的模块代码中MODULE_LICENSE("Dual MIT/GPL")这一项,也要注意符合license_is_gpl_compatible中的要求才行。否则的话。载入模块时。可能又要看到例如以下的告警了
:)

hello: module license  ‘xxx‘  taints kernel.

时间: 2024-08-05 09:31:22

insmod hello.ko -1 Invalid module format最简单的解决的方法的相关文章

insmod hello.ko -1 Invalid module format最简单的解决办法

我也是从网上看到的这种解决办法. 遇到这种情况后,通过dmesg看一下内核日志. 如果发现有如下日志,那就好办了. hello: version magic '2.6.33.3 ' should be '2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 ' 修改内核源码文件include/linux/vermagic.h 把如下VERMAGIC_STRING宏的定义删掉 #define VERMAGIC_STRING \ UTS_RELEASE " &qu

insmod: error inserting 'simp-blkdev.ko': -1 Invalid module format

(一) 今天写了个块设备驱动例子,在虚拟机上加载模块insmod simp_blkdev.ko的时候,出现以下错误. insmod: error inserting 'simple-blk.ko': -1 Invalid module format 其实错误很简单,Makefile的编写失误,因为之前是想让这个驱动模块在TQ2440上运行的,所以,Makefile的编写使用了以下形式: ifneq ($(KERNELRELEASE),) obj-m := simp_blkdev.o else K

insmod: error inserting 'hello.ko': -1 Invalid module format

在学习编写linux驱动程序的时候,一般都是从写一个helloworld的模块开始.但是在编译完成后,进行模块加载的时候,有时会出现如下错误: insmod: error inserting 'hello.ko': -1 Invalid module format 其实,出现这个问题的原因很简单,就是:编译的内核版本与实机运行的内核版本不一致. 所以解决起来也很简单,实机运行的系统的代码树位置一般在/usr/src/kernels.只要将Makefile中的代码树改成实际运行的内核代码即可. i

insmod: error inserting : -1 Invalid module format

Linux(Ubuntu)添加module提示错误 原因:所用内核版本号和正在运行的版本号不对应. 解决方案:重新编译你用的内核,然后安装内核 怎么编译和升级内核,请参见 http://blog.csdn.net/robinsonmhj/article/details/41720835 另外的解决方案请参见 http://m.blog.csdn.net/blog/zyj_123456789/17288823 http://askubuntu.com/questions/14627/no-symb

GG同步到sqlserver报错一例 Invalid date format

在将Oracle表同步到sqlserver时,在sqlserver端应用数据时,可能会遇到这个报错. 2014-05-17 17:20:24 WARNING OGG-01154 SQL error -2147217887 mapping APPLSYS.FND_FLEX_VALIDATION_RULES to dbo.FND_FLEX_VALIDATION_RULES [SQL error -2147217887 (0x80040e21)] Parameter #: 12 Data Type:

配置tomcat连接器后,启动服务报错“No Certificate file specified or invalid file format"异常

1:原来的配置是 1 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 2 maxThreads="150" scheme="https" secure="true" 3 clientAuth="false" sslProtocol="TLS" keystoreFile=

配置CAS错误No Certificate file specified or invalid file format

配置tomcat证书 keystore文件后启动一直报错:(tomcat版本:apache-tomcat-6.0.43) tomcat配置: <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth=&qu

问题:编译eshoponcontainers失败,提示error:invalid reference format

环境: visual studio 2017 v15.4.2,docker ce Version 17.06.0-ce-win19 (12801) 参考问题页: https://github.com/dotnet-architecture/eShopOnContainers/issues/107 问题: F5运行是报错: error : Building webstatus error : invalid reference format. 与: audipen commented on 26

mysql数据库中不能插入0000-00-00 00:00:00日期数据(报错Invalid datetime format: 1292 Incorrect datetime value: &#39;0000-00-00 00:00:00&#39;)

报错信息 SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00:00' for column 'settlementTime' at row 1 我最后把mysql设置成可空,接受null型 参考:https://yq.aliyun.com/articles/17124 mysql数据库中不能插入0000-00-00 00:00:00日期数据(报错Invalid dat