2010-04-27 319 views
26

我嘗試insmod一個Linux內核傳統模塊被我移植。 出現以下錯誤:module_layout版本不兼容

> sudo insmod camac-mx.ko 
insmod: error inserting 'camac-mx.ko': -1 Invalid module format 
dmesg |tail -n 1 
[1312783.938299] camac_mx: disagrees about version of symbol module_layout 

如何解決此問題?

回答

26

這表示您已經針對不同版本的內核編譯了模塊,而不是正在運行的模塊。請注意,即使正在運行的內核和內核源代碼具有相同的數值(例如兩者都是2.6.31-20-服務器),如果兩者使用不同的配置選項,您可能會看到此錯誤。同時檢查機器上是否有多個版本的模塊,並確保您正在加載正確的模塊。

7

解決這個問題(很難)。

首先,您需要內核源代碼和頭文件。

進入你的內核底層目錄,這裏/usr/src/linux-source-2.6.35

檢查使用uname -r,這裏2.6.35-27-通用

make -C /lib/modules/2.6.35-27-generic/build \ 
SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules 

/lib/modules/2.6.35-27-generic/build - > /usr/src/linux-headers-2.6.35-27-generic

檢查模塊依賴與modinfo命令lsmod的和腳本加載它們:

modprobe -r ath5k 
modprobe cfg80211 
modprobe led_class 
modprobe mac80211 
modprobe ath 
insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko 

使用這種方法,vermagic也可能是不同的....化妝modules_install是無用的,但也許是因爲模塊存在於2個不同的地方(/ lib/modules/extra和.../kernel/drivers),不會被替換...

modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath /ath5k/ath5k.ko

我真的不明白爲什麼在ubuntu 10.10中修復/調試模塊非常困難:(

1

找到快速和可行的解決方案here

只需使用modules/build目錄中的makefile而不是/usr/src/linux-source

make -C /lib/modules/`uname -r`/build ... 
12

對於那些在系統工作不訪問內核,內核配置或ksyms的,如果你有一個working.ko和您的內置,無工作,broken.ko

機會可能不會加載,但如果你非常渴望嘗試;

# modprobe --dump-modversions working.ko 
0x0b11e775  module_layout 
# modprobe --dump-modversions broken.ko 
0x2719d41e  module_layout 

然後用你喜歡的十六進制編輯器,更改以匹配:

00016c70 75 e7 11 0b 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou| 

(價值是反向由於尾數排序) 有將最有可能是一大堆你必須匹配。有人可能會寫一個perl腳本來做到這一點....

+0

但我無法找到module_layout,只是很多le_layout的。 – netawater 2015-02-10 14:50:49

+0

@netawater,我認爲你所看到的僅僅是這樣的:「0x75646f6dda9e78e9 le_layout」。什麼,你需要改變的是「75646f6d」,這是「冒頓」反向十六進制內容後的數字。 – wangqi060934 2015-03-24 08:15:48

0

我有一個二進制模塊(pvrsrvkm圖形)Android系統。我一直在爲這個系統構建源代碼內核。一般而言,所有工作正常,但也有一些內核的.config選項(使用kgdb),該pvrsrvkm模塊不會與「關於符號的版本有異議」錯誤加載。

的pvrsrvkm模塊由機器人早期加載,當它出現故障,系統是不可用的,沒有GUI。

既然我已經建立內核,我速戰速決是禁用的版本中加入一行檢查(versindex = 0;)內核的源文件內核/的module.c:

static int check_version(Elf_Shdr *sechdrs, 
unsigned int versindex, 
const char *symname, 
struct module *mod, 
const unsigned long *crc, 
const struct module *crc_owner) 
{ 
unsigned int i, num_versions; 
struct modversion_info *versions; 

/* Exporting module didn't supply crcs? OK, we're already tainted. */ 
if (!crc) 
    return 1; 

/* No versions at all? modprobe --force does this. */ 
versindex = 0; // I added this line 
if (versindex == 0) 
    return try_to_force_load(mod, symname) == 0; 
0

在源之前內核

使清潔ARCH =手臂CROSS_COMPILE = ARM-Linux的gnueabi-

編輯在內核源文件:Module.symvers變 「Module_layout」 合作過的一個,你可以搜索你的設備

在這個文件

重新編譯驅動例如: 化妝-C〜/源內核ARCH =臂CROSS_COMPILE =臂-Linux的gnueabihf- DIR = /源內核M =​​ /模塊/示例模塊

檢查module_layout在你XXX。 KO 有:須藤modprobe的自卸MODVERSIONS XXX.ko

NB