2010-04-27 316 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