Linux 内核模块开发“模块:x86/modules:跳过无效的重定位目标,类型 1 的现有值非零”

Ste*_*vie 4 c linux kernel kernel-module linux-kernel

我目前正在尝试开发一个简单的Linux内核模块。它应该只记录一些东西,它是从互联网上一比一复制的。

我有以下文件:lkm_example.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Robert W. Oliver II");
MODULE_DESCRIPTION("A simple example Linux module.");
MODULE_VERSION("0.01");

static int __init lkm_example_init(void) {
 printk(KERN_INFO "Hello, World!\n");
 return 0;
}

static void __exit lkm_example_exit(void) {
 printk(KERN_INFO "Goodbye, World!\n");
}

module_init(lkm_example_init);
module_exit(lkm_example_exit);
Run Code Online (Sandbox Code Playgroud)

生成文件:

obj-m += lkm_example.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
Run Code Online (Sandbox Code Playgroud)

我还做了以下工作:

sudo apt-get install build-essential linux-headers-`uname -r`
Run Code Online (Sandbox Code Playgroud)

对于编译我使用:

stbau@kernel-dev-vm:~/src/lkm_example$ sudo make
make -C /lib/modules/5.13.0-39-generic/build M=/home/stbau/src/lkm_example modules
make[1]: Entering directory '/usr/src/linux-headers-5.13.0-39-generic'
  CC [M]  /home/stbau/src/lkm_example/lkm_example.o
  MODPOST /home/stbau/src/lkm_example/Module.symvers
  CC [M]  /home/stbau/src/lkm_example/lkm_example.mod.o
  LD [M]  /home/stbau/src/lkm_example/lkm_example.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.13.0-39-generic'
Run Code Online (Sandbox Code Playgroud)

使用insmod执行:

stbau@kernel-dev-vm:~/src/lkm_example$ sudo insmod lkm_example.ko
insmod: ERROR: could not insert module lkm_example.ko: Invalid module format
Run Code Online (Sandbox Code Playgroud)

dmesg 日志给出以下错误:

[   49.272618] lkm_example: module verification failed: signature and/or required key missing - tainting kernel
[   49.272630] module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1, loc 0000000054f3f1c5, val ffffffffc0a0a000
Run Code Online (Sandbox Code Playgroud)

我正在使用以下内核:

stbau@kernel-dev-vm:~/src/lkm_example$ uname -a
Linux kernel-dev-vm 5.13.0-39-generic #44-Ubuntu SMP Thu Mar 24 15:35:05 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

正如您在 dmesg 日志中看到的,我只收到错误,而不是我预期的消息。我不知道我做错了什么/缺少什么。

我认为问题在于该模块未签名。我尝试使用签名文件对其进行签名,但无法生成私钥/公钥文件。

Ste*_*vie 15

重新安装内核头对我有用。

我使用了以下命令:

sudo apt update && sudo apt upgrade
sudo apt remove --purge linux-headers-*
sudo apt autoremove && sudo apt autoclean
sudo apt install linux-headers-generic
Run Code Online (Sandbox Code Playgroud)

如果执行以下步骤后错误仍然存​​在,请查看您正在使用的内核版本 ( uname -r) 并专门卸载并重新安装这些标头。作为快速健全性检查,请确保内核模块也位于相同的内核版本上(verinfo运行后检查该字段modinfo module_name.ko)。

例如,如果您的内核版本是5.19.0-41-generic,请删除标头(如上所述)并再次安装它们:

sudo apt install linux-headers-5.19.0-41-generic