Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28900
  • 博文数量: 21
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-04 08:04
文章分类

全部博文(21)

文章存档

2012年(21)

我的朋友

分类: LINUX

2012-10-25 19:28:40

    在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):

点击(此处)折叠或打开

  1. ifneq ($(KERNELRELEASE),)
  2. module-objs := file1.o file2.o file3.o
  3. obj-m := module.o
  4. else
  5. KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  6. PWD := $(shell pwd)
  7. modules:
  8. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  9. endif

  10. clean:
  11. rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
注意代码中红色斜体的"module",这个名字是最后的模块名,可以由用户自由选择,但是这两个名字必须一致。

阅读(448) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~