驱动程序安装:模块:x86/modules:跳过无效的重定位目标

驱动程序安装:模块:x86/modules:跳过无效的重定位目标

我的情况:

我已经安装并运行了一个运行 fedora 的预构建内核。现在,我想安装 mcp251x 和 mcp25xfd 驱动程序模块,该模块依赖于 can-dev 驱动程序模块,因此我也需要安装该模块。显然,这些模块的源代码存在于该版本的内核源代码中,但我的猜测是它们在内核编译期间没有通过 .config 文件“启用”。所以这是事后驱动程序模块安装尝试。

我从来没有这样做过,所以如果有更简单的方法,请指导我。

我尝试过的:

我首先进入 /lib/modules 目录,查看我的 3 个模块是否已经存在,可以安装。我找到了其中之一:can-dev.ko.xz

所以我安装它:

$ sudo insmod can-dev.ko.xz

这样就完成了,没有错误信息。对于其他 2 个模块,我看到了它们的源代码和 makefile,但调用“make”只是说“没有目标”并且无法构建。

然后我使用 uname -a 查看了版本:

Linux fedora 5.11.3-300.fc34.x86_64

所以我去下载 5.11.3 的源代码:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/tags

我检查当前的编译器版本:

$ gcc --version
$ gcc (GCC) 11.0.0 20210210 (Red Hat 11.0.0-0) 

我验证了这是用于构建内核的相同 gcc 版本:

$ cat /proc/version
$ gcc (GCC) 11.0.0 20210210 (Red Hat 11.0.0-0)

所以显然我不能只进入驱动程序文件夹并调用“make”,即使它有一个 makefile。驱动程序makefile和内核makefile都纠缠在一起,所以我进入内核源代码根目录并修改Makefile:

EXTRAVERSION = -300.fc34.x86_64

这可确保模块中的“vermagic”字符串与当前安装的操作系统版本兼容。

然后,在内核源代码根目录中,我调用:

$ make oldconfig

这会生成一个 .config 文件。我手动编辑 .config 文件以添加以下行:

CONFIG_CAN_MCP251X=m
CONFIG_CAN_MCP251XFD=m

这告诉内核将 MCP251x 和 MCP251xfd 构建为模块(默认情况下根本不构建)。

然后我打电话

$ make prepare

然后,我 cd 进入我尝试构建的特定驱动程序目录(其中包含 c 代码和 Makefile),并调用:

$ make -C ~/linux-5.11.3 M=`pwd` modules

它使用一些特殊参数调用 kernel-source-root Makefile,指示仅在当前目录中构建内核模块。这有效,并生成文件 mcp251xfd.ko 和 mcp251x.ko。

我尝试安装这些模块:

$ sudo insmod mcp251x.ko
$ sudo insmod mcp251xfd.ko

但两者都返回以下错误消息:

insmod: ERROR: could not insert module mcp251xfd.ko: Invalid module format

并致电

$ dmesg

返回:

module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1, loc 00000000abe7d4fb, val ffffffffc10b3a77

我知道唯一需要检查的是幻数是否与 uname -r number 匹配:

$ uname -r
5.11.3-300.fc34.x86_64

检查模块:

$ modinfo mcp251xfd.ko
vermagic: 5.11.3-300.fc34.x86_64

所以我不知道该怎么做或尝试安装这些驱动程序。

答案1

该内核linux-5.11.3与您的发行版提供的内核不同,后者是5.11.3-300.fc34.这-300.fc34使得一切变得不同。添加了 RH 更新。

使用 yum 下载内核源代码,因为它似乎是 Fedora 34。

将目录更改为/usr/src/<source dir>,然后运行make oldconfig && make menuconfig​​或make oldconfig && make xconfig并找到Networking Support->CAN bus subsystem support->CAN device drivers->CAN SPI Interfaces,您将找到列出的设备并勾选它们。

一旦完成,您就可以运行make modules modules_install && depmod -a并且内核模块将位于/lib/modules.

但是,如果内核模块签名到位,这些可能仍然无法加载。

如果是这样,一种选择是完全重建内核并安装它。

另一种方法是要求 RH 在下一次内核更新时启用这些模块。

或者,您可以生成自己的 CA 证书和代码签名证书,签署新模块并将父证书加载到 UEFI DB 中。

您可以确保 UEFI 未配置为secure boot

你会弄脏你的手的......

我想我已经涵盖了一切...

顺便说一句,您的电脑真的需要这些模块吗?

相关内容