Linux kernel 版本不包含GIT 字串
如你載入模組發現下列錯誤訊息
[XXX /]# insmod /lib/modules/xx-gpio.ko
xx_gpio: version magic '2.6.29.09.00 preempt mod_unload ARMv5 ' should be '2.6.2
9.09.00-g1c6039c preempt mod_unload ARMv5 '
insmod: can't insert '/lib/modules/xx-gpio.ko': invalid module format
則是因為GIT版本也被加進去
所以改一下吧
General setup --->
[*] Automatically append version information to the version string
把這個拿掉 載入模組時就不會因為次版本不同...而不能執行了
文章標籤
全站熱搜

安裝模塊時出現:[root@FriendlyARM nfs]# insmod key2.ko
key2: version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM mod_unload ARMv4 '
這一行的意思就是說,當前插入的模塊xxx.ko的版本信息(version magic)與正運行的kernel的版本信息不一致! 應該是'2.6.32.2-FriendlyARM mod_unload ARMv4 ',而實際上xxx.ko的版本信息卻是:'2.6.32.2 mod_unload modversions ARMv4 '; 顯然它們之間差別是很小的。 實際上,根據上面安裝的kernel源碼來看,它們應該是沒有什麼差別的。 所以,下面採用了一種比較極端的方式,強制xxx.ko的版本信息與運行的kernel保持一致。
修改/home/haiyang/linux-2.6.32.2/include/linux/tsrelease.h文件中的宏定義
#define UTS_RELEASE "2.6.32.2
為
#define UTS_RELEASE "2.6.32.2-FriendlyARM”
然後重新編譯xxx.ko模塊,這時候,它與內核的版本信息應該就是一致的了! 試驗下來確實如此,xxx.ko已經可以正常工作了!
但是可能會再次出現:
key2: version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM mod_unload ARMv4 '這是因為arm公司在linux版本中加了自己的標誌
此時需要修改:/home/haiyang/linux-2.6.32.2/include/linux/vermagic.h
[root@localhost linux]# vi vermagic.h
#include <linux/utsrelease.h>
#include <linux/module.h>
#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
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#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_VERMAGIC_MODVERSIONS
MODULE_ARCH_VERMAGIC
"vermagic.h" 34L, 837C
其中,VERMAGIC_STRING就是內核的版本信息,每個kernel module的版本信息就是從源代碼樹中的該宏定義獲取的。 所以,編譯模塊的時候一定要和實際使用該模塊的內核的源代碼樹保持一致! 不要張冠李戴,否則就會在加載模塊的時候出現上述問題!
我的修改是#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#define MODULE_VERMAGIC_MODVERSIONS " "
NOTES: 本方法並不是正規的解決辦法,我是由於不想重新編譯安裝linux kernel,並且能夠確保當前源碼樹中的kernel版本與系統運行的kernel版本是相同的情況下採用的權宜之計。 如果不能保證這一點,最好不要採用這種方法。 以免產生一些莫名其妙的問題! !
實際上最好的辦法是:
要在menuconfig中改
解決辦法如下:
在配置單中添加如下信息
General setup --->
· Prompt for development and/or incomplete code/drivers
(-EmbedSky) Local version - append to kernel release
內核版本的差異導致的。
例如
(做s3c2410_ts觸摸屏的驅動,程序交叉編譯後,insmod出現如下的錯誤:
s3c2410_ts: version magic '2.6.29.4 mod_unload modversions ARMv5 'should be '2.6.29.4-FriendlyARM mod_unload ARMv4 '
linux kernel 中文組的朋友說是編譯器版本的問題。 重新配置2010-11-25 18:45