仪陇家园分类信息网、仪陇生活网、仪陇家园网

搜索

移植驱动完毕后加载时的version magic报错原因以及解决办法

[复制链接]
seo 发表于 2022-5-31 13:29:26 | 显示全部楼层 |阅读模式
移植驱动完毕后加载时的version magic报错原因以及解决办法发布时间:2022/5/31 13:16:08
            
                                                       
                                                       
            
        
        
               
                    
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报错提示。
               
        
        
   
            
        
        
回复

使用道具 举报

全部回复0 显示全部楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

楼主

审核员

热门推荐

联系客服 关注微信 下载APP 返回顶部 返回列表