您的位置:首页 > 其它

[记录]移植驱动完毕后加载时的version magic报错原因以及解决办法(invalid module format)

2016-07-12 15:36 423 查看
原文地址::http://blog.sina.com.cn/s/blog_6e5e78bf010105jj.html

相关文章

1、加载模块出错:version magic '2.6.32-504.el6.i686 SMP mod_unload 686 ' should----http://www.myexception.cn/program/1885736.html

2、加载模块报错 version magic mod_unload ARMv4 invalid module format----http://blog.sina.com.cn/s/blog_752fa65f0100p6wc.html

3、linux的模块加载问题----http://www.21qa.net/questions/2145/2145

History:2012-02-17

Author:yingru

移植rt3070的AP驱动到装有fedora14的PC机上时,模块编译完毕后,加载时提示invalid module format。

PC机环境介绍:

内核版本:2.6.35.6-45.fc14.i686

命令行输入dmesg查看最后的日志,发现如下错误记录:

rtutil3070ap:version magic '2.6.35.14-96.fc14.i686 SMP mod_unload 686 ' should be '2.6.35.6-45.fc14.i686 SMP mod_unload 686'

其余几个模块也是同样错误

version magic真的是个很恶心的东西。。

既然提示出错了就去找原因。

查证AP驱动的makefile里内核目录变量指向的是当前PC机所用内核目录。/lib/modules/`uname -r`/build

这一步没有错。那么说明驱动的makefile是正确的

切换到/lib/modules/`uname -r`/目录下,查看build(build在此处是一个符号链接), ls -al 发现build指向的目录是/usr/src/kernels/2.6.35.14-96.fc14.i686,问题在这里,虽然我用的目录是/lib/modules/`uname -r`/build 这个目录貌似与我当前内核版本(uname -r 即2.6.35.6-45.fc14.i686)一致,但是build这个符号链接指向的内核源码却是2.6.35.14-96.fc14.i686的,这样造成了编译出来的模块所带的version
magic是2.6.35.14-96.fc14.i686这一版本,加载时与uname -r不符。

那么要解决这一问题,就需要“篡改”一下内核源码里的version magic 。

驱动模块的version magic信息是怎么生成的:

2.6 内核下,在linux/vermagic.h中定义有VERMAGIC_STRING,VERMAGIC_STRING不仅包含内核版本号,还包含有内核 使用的gcc版本,SMP与PREEMPT等配置信息。模块在编译时,我们可以看到屏幕上会显示"MODPOST"。在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts\mod\modpost.c文件中可以看到模块后续处 理部分的代码。模块编译生成后,通过`modinfo mymodule.ko`命令可以查看此模块的vermagic等信息。2.6
内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的 vermagic信息是否一致,两者一致时,模块才能被装载。譬如Fedora core 4 与core 2 使用的都是2.6 版本内核,在Fedore Core 2下去加载Fedora Core4下编译生成的hello.ko,会出现"invalid module format" 错误。
http://www.ibm.com/developerworks/cn/linux/l-module26/
既然是这个道理,那么只需要把/usr/src/kernels/2.6.35.14-96.fc14.i686/目录下源码中的include/linux/vermagic.h中的VERMAGIC_STRING修改成与当前PC内核uname -r一致即可。

修改如下:

#define VERMAGIC_STRING                 \

"2.6.35.6-45.fc14.i686" ""      \

MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT  \

MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \

MODULE_ARCH_VERMAGIC

(描红为修改处)

具体的格式可以在modinfo yourmodule.ko查看之后 再确定修改哪里 修改完后重新make即可 加载后没有version magic报错提示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: