[英]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
它显示了以下内容
不同意符号symbol_name的版本
您需要针对要运行的相同版本内核构建内核模块。 因此,如果你有内核4.3源已下载你需要编译的内核版本,并启动与运行的尝试加载内核前。
那你有两个解决方案:
zypper install kernel-source
或在其他发行版上zypper install kernel-source
等效命令。) make -C / lib / modules / $(uname -r)/ build M = $ PWD modules,“$(uname -r)”表示你正在编译你正在运行的内核版本,所以你应该能够insmod如果你没有更改标题,那么当前内核中的模块。
从您的文本,“只是为了检查我已经从内核目录中复制了一些文件到我的项目目录。对其进行了更改并向其中插入了更多代码。”
如果您已对内核源进行了修改,那么您可能需要重新编译新内核并使用新的更新内核进行引导。 然后,您应该能够使用修改后的头文件编译内核模块。
这里的问题是您的内核模块正在使用其他内核模块的导出符号,在这种情况下,这些符号似乎是linux InfiniBand RDMA堆栈的导出方法或符号。
要解决符号版本问题,请Module.symvers
复制Module.symvers
文件
/usr/src/ofa-kernel
目录并将其粘贴到您当前的工作目录中。 然后再次制作模块。 现在insmod
应该可以正常工作。
注意:Module.symvers文件包含所有内核模块导出符号的信息。 因此,通过将其复制到您的工作目录,您正在帮助kbuild了解有关已使用的导出符号的更多信息。
如果您没有找到Module.symvers或它是空的,那么使用create_Module.symvers.sh
创建一个
看起来你构建了agAinst right kernel.something来处理内核的编译方式。 (请参阅Config_conversions)。 试试--force
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.