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脚本来做这个....
解决这个问题(很难).
首先,您需要内核源代码和标头.
转到你的内核基础目录,这里是/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
使用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
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修复/调试模块这么困难:(