module_layout版本不兼容

Bas*_*evs 27 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
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

ctu*_*fli 29

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


lun*_*man 13

对于那些在没有访问内核,内核配置或ksyms的系统上工作的人,如果你有一个working.ko和你的内置,非工作,broken.ko.

它可能不会加载,但如果你绝望地尝试;

# modprobe --dump-modversions working.ko
0x0b11e775      module_layout
# modprobe --dump-modversions broken.ko
0x2719d41e      module_layout
Run Code Online (Sandbox Code Playgroud)

然后使用您喜欢的十六进制编辑器,将其更改为匹配:

00016c70  75 e7 11 0b 6d 6f 64 75  6c 65 5f 6c 61 79 6f 75  |u...module_layou|
Run Code Online (Sandbox Code Playgroud)

(由于字节顺序,值是反向的)很可能会有一大堆你需要匹配.有人可以写一个perl脚本来做这个....


Tan*_*guy 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
Run Code Online (Sandbox Code Playgroud)

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

使用modinfolsmod检查模块依赖关系并将其加载到脚本中:

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
Run Code Online (Sandbox Code Playgroud)

使用这种方法,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修复/调试模块这么困难:(