系统相关
首页 > 系统相关> > linux – 致命:未找到模块hello.ko

linux – 致命:未找到模块hello.ko

作者:互联网

我使用的是CentOS-6.5,默认内核是2.6.32-431.11.2.el6.x86_64.我下载了2.6.32并构建了该内核(在/lib/modules/2.6.32下).

我为简单的hello world程序编写了一个模块.该计划正在以下案例中运作:

Makefile:/ lib / modules / $(shell uname -r)/ build(默认内核)

$sudo insmod hello.ko

$dmesg
module inserted..
hello world..

我的程序不适用于以下情况:

Makefile:/lib/modules/3.2.32/build(新建内核)

$sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

dmesg: 
hello: disagrees about version of symbol module_layout

我尝试了modprobe两种情况,它显示下面的错误

致命:未找到模块问候.

如何使用2.6.32内核编译我的模块?

解决方法:

Linux内核包含数据结构,其布局不仅因版本而异,还取决于编译选项.因此,在编译内核模块时,您不仅需要拥有内核源代码的头文件,还需要拥有内核编译期间生成的一些头文件.仅仅解压缩内核源代码是不够的.

使用CONFIG_MODVERSIONS构建的内核,版本号可以不同,但​​数据结构的布局必须相同.此选项在Ubuntu内核中激活.使用此选项,除了标题之外,还需要根据正确的Module.symvers文件编译模块.与大多数发行版一样,CentOS将此文件包含在与编译产生的内核头相同的包中. CentOS内核头包称为kernel-headers;确保安装与您正在编译的内核相匹配的版本.另请参阅CentOS文档中的Overview of kernel packages和Wiki上的You do not need the full kernel source.

在没有CONFIG_MODVERSIONS的情况下构建内核(如果编译自己的内核可能就是这种情况),加载模块时的检查是一个简单的版本检查.您可以获取解压缩的内核源代码,复制在运行内核编译期间使用的.config,然后运行make modules_prepare.您有责任验证您对内核所做的任何补丁都不会影响二进制兼容性.

标签:linux,kernel,compiling,kernel-modules
来源: https://codeday.me/bug/20190814/1657341.html