我尝试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
我该如何解决这个问题?
答案 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