编译linux内核问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译linux内核问题相关的知识,希望对你有一定的参考价值。

make[1]: 正在进入目录 `/usr/src/linux-2.6.18'
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CHK include/linux/compile.h
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
kernel/built-in.o: In function `.text.lock.mutex':
mutex.c:(.sched.text+0x17a7): undefined reference to `__mutex_lock_slowpath'
mutex.c:(.sched.text+0x17b1): undefined reference to `__mutex_unlock_slowpath'
make[1]: *** [.tmp_vmlinux1] 错误 1
make[1]:正在离开目录 `/usr/src/linux-2.6.18'
make: *** [debian/stamp/build/kernel] 错误 2

这要怎么解决?

参考技术A 可能原因是编译器版本与内核版本匹配度的问题。请用gcc4或gcc3的版本试试 参考技术B 把日志拿出来看看。本回答被提问者采纳

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

【中文标题】如何为不同的 linux 内核编译一个 linux 内核模块【英文标题】:How to compile a linux kernel module for different linux kernel 【发布时间】:2021-08-16 22:25:24 【问题描述】:

我对内核编程有点陌生,但几天来我一直在为这个问题苦苦挣扎。我有一台带有 linux 内核 '5.10.0-kali7-amd64' 的机器,我用它来为 Ubutnu 16.04.4 '4.4.0-119-generic' 开发一个 linux 内核模块,但我想不通这样我就可以在我的机器上为该版本编译它并让它在 4.4.0 内核机器上实际工作。

我得到的最接近的是:

    我从https://launchpad.net/ubuntu/xenial/+package/linux-headers-4.4.0-119下载了源码 并使用 dpkg 安装 然后我从https://www.ubuntuupdates.org/package/core/xenial/main/updates/linux-image-4.4.0-119-generic 下载并安装了 4.4.0-119-generic 两者都安装没有问题。 我在我的 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 的模块,但那个模块确实有效。 以下是两者的 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 机器?

【问题讨论】:

请将完整的错误信息复制并粘贴到问题中。 是的,抱歉我添加了它 请添加到与insmod 故障相关的dmesg 的问题帖子输出中。 哦,我什至不知道会在 dmesg 中留下输出。我会添加它 【参考方案1】:

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

解决这个问题:

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

现在它可以工作了!

【讨论】:

以上是关于编译linux内核问题的主要内容,如果未能解决你的问题,请参考以下文章

linux内核移植编译时遇到的问题

Linux内核配置编译以及模块开发

Linux内核配置编译以及模块开发

linux编译内核步骤

Linux 内核编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

编译linux-2.6.18内核出错