Linux驱动开发错误:module license ‘unspecified’ taints kernel.

原文链接: http://blog.csdn.net/zengxianyang/article/details/50710695

前言

今天我要来说说在Linux驱动开发中Makefile编写规则的问题。其实这是驱动开发中的基础性的问题,怪自己基础不够扎实啊,犯了这样的低级错误。写这篇文章让自己巩固一下基础吧,唯有厚积,才能薄发!扎实的编程基础,是一个底层软件工程师应该具备的素质,这样才能年薪百万,迎娶白富美,走上人生巅峰!麻痹,老子又在意淫了,女朋友在哪里都还不知道,说多了都是泪,言归正传!别装逼了!讲正事!

1 Linux驱动Makefile编写规则介绍

1.1 Linux驱动Makefile实例讲解

这里,我们简单的举一个hello驱动的Makefile,来讲解驱动开发中,makefile的编写规则
[objc] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. obj-m := hello.o
  2. hello-obj := hello_main.o file1.o file2.o
  3. KERNELDR := /usr/src/linux-2.6.26
  4. PWD := $(shell pwd)
  5. modules:
  6.     $(MAKE) -C $(KERNELDR) M=$(PWD) modules
  7. moduels_install:
  8.     $(MAKE) -C $(KERNELDR) M=$(PWD) modules_install
  9. clean:
  10.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
(1)obj-m := hello.o
表面驱动模块从目标文件hello.o建立,从目标文件建立后,模块的名字为hello.ko。
  (2) module-objs:如果模块由N个文件组成,那么其他文件就应该描述如下:module-objs:= file1.o file2.o,由于我们的模块叫做hello,在这个例子中应该写为hello-objs 。
(3)KERDIR  := /usr/src/linux-2.6.26
用来定位用于编译驱动的内核源码的目录位置。
(4)-C表示kernel source目录,在/lib/modules/<uname -r’>/build,在那里可以找到kernel的最高lenvel的makefile,M=表示在建立模块target的时候,makefile回归到我  们模块程序的目录。

2 驱动加载错误:module license ‘unspecified’ taints kernel

当时我的液晶驱动是由多个C文件组成的一个模块,但是由于多个C文件当中的一个xxx.o文件和模块目标文件xxx.o重名了,所以导致这个错误的,当时加载驱动的时候如下错误:
[objc] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. root@Phoenix /root#insmod mxc_elcdif_fb.ko
  2. mxc_elcdif_fb: module license ‘unspecified’ taints kernel.
  3. Disabling lock debugging due to kernel taint
  4. mxc_elcdif_fb: Unknown symbol self_pid (err 0)
  5. mxc_elcdif_fb: Unknown symbol gpio_free (err 0)
  6. mxc_elcdif_fb: Unknown symbol drv_version (err 0)
  7. mxc_elcdif_fb: Unknown symbol reset_gpio (err 0)
  8. mxc_elcdif_fb: Unknown symbol disp_init_gpio (err 0)

2.1 解决办法

如果我们有多个c文件,可以在test-objs参数中加入他们的obj文件。接下来就是make了,编译后,生成hello.o文件和hello.ko,还有hello.mod.c及其obj文件,Module.markers Module.sysvers Modules.order 文件。

我们对多个*.c文件情况做一个说明:我们希望创建一个模块的名字叫做hello,我们有三个*.c文件,分别为hello.c, file1.c和file2.c。这样是有问题的,因为在Makefile中obj-m := hello.o,这是指定模块的名称, hello-objs := file1.o file2.o hello.o,这里是说hello模块包括的的obj文件,如果我们在里面不填写hello.o,那么实际并没有编译hello.c,而是在CC[M] file1.o和file2.o,通过LD[M]得到模块hello.o,如果我们在这里填写了hello.o,那么在obj-m和hello-objs中都含有hello.o,对make来讲会产生循环和混淆,因此也不能这样书写。如果我们由多个C文件来构造一个模块,那么C文件的名字不能和模块名字一样,在这个例子中我们可以将hello.c改名为hello_main.c,在Makefile中obj-m := hello.o,hello-objs = file1.o file2.o hello_main.o。

发表评论

电子邮件地址不会被公开。 必填项已用*标注