如何为不同的 linux 内核编译 linux 内核模块

How to compile a linux kernel module for different linux kernel

我是内核编程的新手,但几天来我一直在为这个问题苦苦挣扎。我有一台带有 linux 内核 '5.10.0-kali7-amd64' 的机器,我用它来为 Ubutnu 16.04.4 '4.4.0-119-generic' 开发 linux 内核模块,但我想不出有什么方法可以在我的机器上为那个版本编译它并使其在 4.4.0 内核机器上实际工作。

我得到的最接近的是:

  1. 我从 https://launchpad.net/ubuntu/xenial/+package/linux-headers-4.4.0-119 下载了源代码 并使用 dpkg
  2. 安装
  3. 然后我从 https://www.ubuntuupdates.org/package/core/xenial/main/updates/linux-image-4.4.0-119-generic
  4. 下载并安装了 4.4.0-119-generic
  5. 两者都安装没有问题。
  6. 我通过在我的 Makefile make -C /lib/modules/4.4.0-119-generic/build M=$(PWD) modules 中使用编译了我的模块,它也可以工作并编译了我的 hello world 模块。

然而,当上传到 4.4.0 机器时,insmod 出错说 insmod: ERROR: could not insert module rootkitMy.ko: Invalid module format。 dmesg 说: module: rootkit: Unknown rela relocation: 4 然后我在 4.4.0 机器上编译了我的源代码并创建了一个具有完全相同的 modinfo 的模块,但那个确实有效。 这是两者的修改信息:

filename:       /rootkit.ko
version:        0.01
description:    Rootkit hook
author:         Bl4ckC4t
license:        GPL
srcversion:     46604268C8D1B7FA5115CB4
depends:        
vermagic:       4.4.0-119-generic SMP mod_unload modversions retpoline 



filename:       /rootkitMy.ko
version:        0.01
description:    Rootkit hook
author:         Bl4ckC4t
license:        GPL
srcversion:     46604268C8D1B7FA5115CB4
depends:        
vermagic:       4.4.0-119-generic SMP mod_unload modversions retpoline 

rootkitMy.ko 是在 5.10 机器上编译的,没有工作,而 rootkit.ko 是在 4.4.0 机器上编译的,注入 insmod 后可以正常工作我要从我的 5.10 机器上编译一个工作模块吗?

我设法解决了这个问题。 Unknown rela relocation: 4 是由于内核处理 PLT 的方式发生变化而导致的 insmod 错误,更具体地说是 R_X86_64_PC32 和 R_X86_64_PLT32。对于 binutils >= 2.31,链接器已决定使用 R_X86_64_PLT32 重定位,这在旧内核中不受支持。

解决这个问题:

  1. 我从 https://ftp.gnu.org/gnu/binutils/
  2. 下载了旧版本的 binutils (2.26.1)
  3. 已从存档中提取文件夹
  4. 通过 运行
  5. 将 binutils 编译为 /usr/local/binutils-2.6
./configure --prefix=/usr/local/binutils-2.6
make
sudo make install
  1. 将新的 binutils 导出到我的路径并重新编译我的模块 export PATH=/usr/local/binutils-2.6/bin:$PATH

现在可以使用了!