现象
# insmod gpio_keys.ko
gpio_keys: version magic '4.19.78-ga5c4d9482-dirty mod_unload ARMv6 p2v8 ' should be
'4.19.78-bc5c4ad452-dirty mod_unload ARMv6 p2v8 '
insmod: can't insert 'gpio_keys.ko': invalid module format
# uname -r
4.19.78a-bc5c4ad452-dirty
原因
上述例子中:
- linux内核version magic: 4.19.78-bc5c4ad452-dirty
- 内核模块version magic: 4.19.78-ga5c4d9482-dirty
当内核与内核模块编译时的版本,所对应的配置不一样时,模块内核版本后附加的字符串(如: 4.19.78-ga5c4d9482-dirty
)也会产生变化.
一般这种问题出现在内核与模块并非同时更新,有可能内核版本滞后,而新编译的内核模块所对应的内核相比于之前的内核发生了变化,内核模块与之前的内核可能存在不兼容的情况.
解决
- 使用同一版本的内核编译,并更新
- 可以在linux配置中去除这个后缀,version magic就会变成固定的版本号.配置办法是将下图中的
Auto calculation of the decompressed kernel image address
配置取消.后续内核加载就不需要考虑该问题了(不推荐)