module_layout版本不兼容

时间:2010-04-27 09:53:07

标签: module linux-kernel

我尝试insmod一个由我移植的linux内核遗留模块。 出现以下错误:

> 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

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:29)

这表示您已针对内核的不同版本编译模块而不是正在运行。请注意,即使正在运行的内核和内核源具有相同的数值(例如,两者都是2.6.31-20服务器),如果两者使用不同的配置选项,您可能会看到此错误。同时检查机器上是否有多个版本的模块,并确保加载正确的模块。

答案 1 :(得分:13)

对于那些在没有访问内核,kernel-config或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脚本来执行此操作....

答案 2 :(得分:7)

要解决这个问题(很难)。

首先,您需要内核源代码和标头。

转到你的内核基础目录,这里 /usr/src/linux-source-2.6.35

检查 uname -r ,此处 2.6.35-27-generic

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也可能不同.... make 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修复/调试模块这么困难:(

答案 3 :(得分:1)

找到了快速且有效的解决方案here

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

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

答案 4 :(得分:0)

我有一个带有一个二进制模块的android系统(pvrsrvkm用于图形)。我一直在为这个系统从源代码构建内核。一般来说一切正常,但是对于一些内核.config选项(对于kgdb),pvrsrvkm模块不会加载“对符号版本不一致”错误。

pvrsrvkm模块早期由android加载,当它失败时,系统无法使用,没有GUI。

由于我已经在构建内核,我的快速解决方法是通过向内核源文件kernel / module.c添加一行(versindex = 0;)来禁用版本检查:

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;

答案 5 :(得分:0)

在源内核之前

make clean ARCH = arm CROSS_COMPILE = arm-linux-gnueabi -

在源内核中编辑文件:Module.symvers更改" Module_layout"使用一个,您可以在您的设备上搜索此文件

重新编译驱动程序示例: make -C~ / source-kernel ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- DIR = / source-kernel M = / modules / example modules

检查XXX.ko中的module_layout with:sudo modprobe --dump-modversions XXX.ko

NB