在 insmod 后不同意符号 symbol_name 的版本
Disagrees about version of symbol symbol_name after insmod
我是内核编程的新手。
为了实施我的项目工作,我从 kernel.org.
下载了最新的稳定 内核 (v4.3)
为了检查,我已经从内核目录复制了一些文件到我的项目目录中。对其进行了更改并向其中插入了更多代码。
然后我使用
在SLES11 Linux内核上编译
make -C /lib/modules/$(uname -r)/build M=$PWD modules
我用过下面的makefile
obj-m := my_module.o
my_module-objs := module_main.0 other_module1.o other_module2.o other_module3.o
编译成功。
但是当我尝试使用
插入内核时
insmod my_sample.ko
显示如下
disagrees about version of symbol symbol_name
您需要针对您要使用的同一版本内核构建内核模块 运行。因此,如果您拥有已下载的内核 4.3 源代码,则需要编译 那个 版本的内核并在尝试加载内核之前使用 运行ning 引导。
那么你有两个解决方案:
- 为您当前 运行ning 的内核下载内核源代码(您可以在 SLES 上使用
zypper install kernel-source
或在其他发行版上使用等效命令安装它们。)
- 编译 4.3 内核并将其安装到您的操作系统中。如果您需要这方面的帮助,请提出一个单独的问题(它可能属于超级用户,不在这里)。请注意,如果内核和 glibc 紧密耦合,并且如果您有一个非常旧的 C 库,则可能无法 运行 新内核。
make -C /lib/modules/$(uname -r)/build M=$PWD 模块,
"$(uname -r)" 表明您正在针对现在的内核版本 运行 进行编译,因此如果您没有更改 headers,您应该能够在当前内核中插入模块.
根据您的文字,
"Just for checking I have copied a few files from the kernel directories into my project directory. Made changes to it and inserted a few more code to it."
如果您对内核源代码进行了修改,那么您可能需要重新编译新内核并使用更新后的新内核启动。然后你应该能够用修改后的 headers.
编译你的内核模块
看起来您构建 agAinst 是正确的 kernel.something 来处理您的内核编译方式。 (参见 Config_conversions)。试试 --force
这里的问题是您的内核模块正在使用其他内核模块的导出符号,在这种情况下似乎是 linux InfiniBand RDMA 堆栈的导出方法或符号。
要解决符号版本问题,请从
复制 Module.symvers
文件
/usr/src/ofa-kernel
目录并将其粘贴到您当前的工作目录。然后你再次制作你的模块。现在 insmod
应该可以正常工作了。
NOTE: The Module.symvers file contains information of all the kernel
module exported symbol. So by copying it to your working directory,
you are helping kbuild to know more about the used exported symbols.
如果您没有找到 Module.symvers 或者它是空的,则使用 create_Module.symvers.sh
创建一个
我是内核编程的新手。
为了实施我的项目工作,我从 kernel.org.
下载了最新的稳定 内核 (v4.3)为了检查,我已经从内核目录复制了一些文件到我的项目目录中。对其进行了更改并向其中插入了更多代码。
然后我使用
在SLES11 Linux内核上编译make -C /lib/modules/$(uname -r)/build M=$PWD modules
我用过下面的makefile
obj-m := my_module.o
my_module-objs := module_main.0 other_module1.o other_module2.o other_module3.o
编译成功。 但是当我尝试使用
插入内核时insmod my_sample.ko
显示如下
disagrees about version of symbol symbol_name
您需要针对您要使用的同一版本内核构建内核模块 运行。因此,如果您拥有已下载的内核 4.3 源代码,则需要编译 那个 版本的内核并在尝试加载内核之前使用 运行ning 引导。
那么你有两个解决方案:
- 为您当前 运行ning 的内核下载内核源代码(您可以在 SLES 上使用
zypper install kernel-source
或在其他发行版上使用等效命令安装它们。) - 编译 4.3 内核并将其安装到您的操作系统中。如果您需要这方面的帮助,请提出一个单独的问题(它可能属于超级用户,不在这里)。请注意,如果内核和 glibc 紧密耦合,并且如果您有一个非常旧的 C 库,则可能无法 运行 新内核。
make -C /lib/modules/$(uname -r)/build M=$PWD 模块, "$(uname -r)" 表明您正在针对现在的内核版本 运行 进行编译,因此如果您没有更改 headers,您应该能够在当前内核中插入模块.
根据您的文字, "Just for checking I have copied a few files from the kernel directories into my project directory. Made changes to it and inserted a few more code to it."
如果您对内核源代码进行了修改,那么您可能需要重新编译新内核并使用更新后的新内核启动。然后你应该能够用修改后的 headers.
编译你的内核模块看起来您构建 agAinst 是正确的 kernel.something 来处理您的内核编译方式。 (参见 Config_conversions)。试试 --force
这里的问题是您的内核模块正在使用其他内核模块的导出符号,在这种情况下似乎是 linux InfiniBand RDMA 堆栈的导出方法或符号。
要解决符号版本问题,请从
复制Module.symvers
文件
/usr/src/ofa-kernel
目录并将其粘贴到您当前的工作目录。然后你再次制作你的模块。现在 insmod
应该可以正常工作了。
NOTE: The Module.symvers file contains information of all the kernel module exported symbol. So by copying it to your working directory, you are helping kbuild to know more about the used exported symbols.
如果您没有找到 Module.symvers 或者它是空的,则使用 create_Module.symvers.sh