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的版本
您需要针对要运行的相同版本内核构建内核模块.因此,如果你有内核4.3源已下载您需要编译该版本的内核和启动与运行的尝试加载内核前.
那你有两个解决方案:
zypper install kernel-source在SLES上安装那些内核源代码或在其他发行版上安装等效命令.)这里的问题是您的内核模块正在使用其他内核模块的导出符号,在本例中似乎是 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