最近搞内核实验bug实在太多,每次都得重新编译内核,所以把部分代码先移植到模块里进行测试,测试无bug后再移植到内核代码中。
刚一转换成模块,问题就来了:
insmod: ERROR: could not insert module exp.ko: Unknown symbol in module
很直接,模块中存在未知的符号!
这个时候又需要dmesg来打印一下信息了~ 使用dmesg命令打印出了如下的信息,从这个信息就可以很明确的看到是符号exps_init Unknown,接下来就顺着报错信息和dmesg给出的线索来进行排查~
[ 412.332317] exp: Unknown symbol exps_init (err 0)
其实在移植到模块的时候就意料到了会出这样的问题,我的exps_init其实并没有被链接进入到我的模块代码里面。
模块代码一共包含3个.c文件:
exp.c
exps.c
exp.h
exp.c和exps.c都包含exp.h,exps.c类似于工具函数,里面的内容被exp.c中调用
其中exps_init定义在exps.c文件中,但是Makefile文件却只编译了exp.c,所以要将exps.c一块编译进去。
原始报错Makefile:
ifneq ($(KERNELRELEASE),)
obj-m:=exp.o
else
#generate the path
CURRENT_PATH:=$(shell pwd)
CONFIG_MODULE_SIG = n
#the abs