【问题标题】:Unable to load kernel module after compiling it separately单独编译后无法加载内核模块
【发布时间】:2020-03-27 11:50:19
【问题描述】:

我正在尝试“制作”并将“/drivers/md/raid0.ko”模块加载到我的 linux 内核中,但出现此错误。

# modprobe raid0 --force-vermagic
modprobe: ERROR: could not insert 'raid0': Exec format error

dmesg

[Dec 2 15:10] raid0: version magic '5.0.0 SMP mod_unload ' should be '5.0.0-36-generic SMP mod_unload '

我的内核版本是

# uname -a
Linux ubuntu1 5.0.0-36-generic #39-Ubuntu SMP Tue Nov 12 09:46:06 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

我尝试加载的代码取自链接https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.tar.xz

因此版本是 5.0.0,没有 EXTRAVERSION -36

我尝试了很多方法,但都失败了。

  1. 在构建模块之前使用命令make EXTRAVERSION=-1 modules_prepare 设置EXTRAVERSION
  2. 加载内核时使用--force-vermagic,但失败。
  3. 在构建内核之前从/usr/lib/modules/$(uname -r)/build/Makefile 复制 Makefile。

我同时使用了make SUBDIRS=drivers/md modules 和make M=drivers/md 进行构建,但两者的结果相同。

需要帮助!

【问题讨论】:

  • 你必须使用正在运行的内核中的头文件(kernel-headers / linux-headers 包,或者,如果它需要一些内部,kernel-sources / linux-sources 之一。无论哪个适合发行版你正在使用。
  • 对于 Ubuntu:askubuntu.com/questions/159833/…(实际上这个主题对 StackExchange 的 Ubuntu 部分很有用)
  • @0andriy,我正在使用askubuntu.com/questions/515407/… 中的步骤,但面临一些其他问题.. 所以认为可能有一种通用的方法。
  • @Haris:“通用方式”是针对构建树对应到您的目标内核构建模块。也就是说,如果你想在5.0.0-36-generic内核(Ubuntu中提供)中运行模块,那么你需要使用构建树/usr/lib/modules/5.0.0-36-generic/build(由相应的Ubuntu包提供)。如果您在采用该方法时遇到了问题,请描述该问题。
  • @Tsyvarev。我正在尝试,但起初它不起作用。现在,我通过更改主 Makefile 中的 EXTRAVERSION 更改使其工作。

标签: linux-kernel kernel-module device-driver


【解决方案1】:

强制 modprobe 忽略魔法 str

使用 --force-vermagic optin

每个模块都包含一个包含重要信息的小字符串, 例如内核和编译器版本。如果模块加载失败 内核抱怨“版本魔法”不匹配,你 可以使用此选项将其删除。当然,这个检查是为了 你的保护,所以这个使用选项是危险的。这适用于 插入的任何模块:命令行上的模块(或别名) 以及它所在的任何模块

在这种情况下 modprob 忽略魔法 str

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多