在Linux内核模块的编译过程中,如果模块所依赖的源文件(.c)有多个,那么在编写Makefile的过程中就需要注意,一不小心,就会出现:
1. module license 'unspecified' taints kernel,如下图:
2. Unknow symbol in module
或
出现第二个错误的时候很容易联想到链接过程出了问题;但是出现第一个错误时就很难发现了,因为很多情况下MODULE_LICENSE宏已经指定出现在程序里了。其实这很有可能也是由Makefile编写错误形成的,且这种情况下都有多个源文件组成。
当一个模块需要多个源文件时,最后生成的模块名(obj-m所制定的名称)最好与所有源文件的名字都不相同,否则make会产生混淆。按照LDD3中提供的模版,可编写如下Makefile文件(假设文件的源文件由file.c,file2.c,file3.c组成,最后生成的模块名为module.ko):
- ifneq ($(KERNELRELEASE),)
- module-objs := file1.o file2.o file3.o
- obj-m := module.o
- else
- KERNELDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- modules:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- endif
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
注意代码中红色斜体的"module",这个名字是最后的模块名,可以由用户自由选择,但是这两个名字必须一致。
阅读(486) | 评论(0) | 转发(0) |