在insmod之后不同意符号symbol_name的版本

use*_*499 7 c linux linux-kernel

我是内核编程的新手.

为了实现我的项目工作,我从kernel.org下载了最新的稳定内核(v4.3).

只是为了检查我已经将内核目录中的一些文件复制到我的项目目录中.对其进行了更改并向其中插入了更多代码.

然后我在SLES11 Linux内核上编译使用

make -C /lib/modules/$(uname -r)/build M=$PWD modules
Run Code Online (Sandbox Code Playgroud)

我使用了下面的makefile

obj-m := my_module.o
my_module-objs := module_main.0 other_module1.o other_module2.o other_module3.o
Run Code Online (Sandbox Code Playgroud)

它编译成功.但是当我尝试使用时插入内核

insmod my_sample.ko
Run Code Online (Sandbox Code Playgroud)

它显示了以下内容

不同意符号symbol_name的版本

在此输入图像描述

dav*_*ave 8

您需要针对要运行的相同版本内核构建内核模块.因此,如果你有内核4.3源已下载您需要编译版本的内核和启动与运行的尝试加载内核前.

那你有两个解决方案:

  1. 下载当前运行的内核的内核源代码(您可以zypper install kernel-source在SLES上安装那些内核源代码或在其他发行版上安装等效命令.)
  2. 编译并将4.3内核安装到您的操作系统中.如果你需要帮助,那就问一个单独的问题(它可能属于超级用户而不是这里).请注意,如果内核和glibc紧密耦合,并且如果您有一个非常旧的C库,则可能无法运行新内核.


Utk*_*nha 3

这里的问题是您的内核模块正在使用其他内核模块的导出符号,在本例中似乎是 linux InfiniBand RDMA 堆栈的导出方法或符号。

要解决符号版本问题,请Module.symvers

/usr/src/ofa-kernel
Run Code Online (Sandbox Code Playgroud)

目录并将其粘贴到您当前的工作目录。然后你再次制作你的模块。现在insmod应该可以正常工作了。

注意:Module.symvers 文件包含所有内核模块导出符号的信息。因此,通过将其复制到您的工作目录,您可以帮助 kbuild 了解有关所使用的导出符号的更多信息。

如果你没有找到 Module.symvers 或者它是空的,那么使用以下命令创建一个create_Module.symvers.sh