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

原创 2016年02月22日 00:05:37

前言

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

1 Linux驱动Makefile编写规则介绍

1.1 Linux驱动Makefile实例讲解

这里,我们简单的举一个hello驱动的Makefile,来讲解驱动开发中,makefile的编写规则
obj-m := hello.o  
hello-obj := hello_main.o file1.o file2.o
KERNELDR := /usr/src/linux-2.6.26  
PWD := $(shell pwd)  
modules:  
    $(MAKE) -C $(KERNELDR) M=$(PWD) modules  
moduels_install:  
    $(MAKE) -C $(KERNELDR) M=$(PWD) modules_install  
clean:  
    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重名了,所以导致这个错误的,当时加载驱动的时候如下错误:
root@Phoenix /root#insmod mxc_elcdif_fb.ko 
mxc_elcdif_fb: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint
mxc_elcdif_fb: Unknown symbol self_pid (err 0)
mxc_elcdif_fb: Unknown symbol gpio_free (err 0)
mxc_elcdif_fb: Unknown symbol drv_version (err 0)
mxc_elcdif_fb: Unknown symbol reset_gpio (err 0)
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。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

kernel module编程(一):建立一个小例子

  这是一个很简单的小例子hello world。也是《Linux Device Drivers》一书第二章的书读笔记。需要开发环境  为了使得内核模块可以编译,我们需要安装kernel-devel的...

insmod时出现module license 'unspecified' taints kernel

insmod时出现module license 'unspecified' taints kernel
  • zanget
  • zanget
  • 2010年06月16日 02:14
  • 3771

module license 'unspecified' taints kernel解决

在驱动时出现module license 'unspecified' taints kernel,要加入MODULE_LICENSE("GPL");就不会出现这个错误。...

hello: module license 'unspecified' taints kernel.

测试驱动开发平台 为了后续学习的顺利进行,我们利用最简单的hello,world程序,在内核上挂载和卸载我们自己编写的hello模块。说明:本文调试环境VMware Workstation 5.0+...

Disabling lock debugging due to kernel taint 问题求解

环境: arm-linux, kernel3.2.0, arm-gcc 4.6.3 编写驱动后,加载时提示如下: Disabling lock debugging due to kerne...

module license 'unspecified' taints kernel

单一的一个文件hello.c是可以编译成功(hello.ko)并且运行的。但是增加了两个文件后(1.c和1.h)。编译成功但是insmod时出现: module license 'unspecifi...
  • zanget
  • zanget
  • 2011年08月04日 11:22
  • 3130

linux-3.1.4下的驱动模块 "Unknown symbol in module" 问题(by liukun321咕唧咕唧)

在加载自己写的3.1.4内核的adc驱动时,频频出现下面的错误提示,以前在2.6.29的内核上从未碰到: [root@LK2440 drivers]# insmod /lib/modules/adc...

module license 'unspecified' taints kernel.

在加载自己写的3.1.4内核的adc驱动时,频频出现下面的错误提示,以前在2.6.29的内核上从未碰到: [root@LK2440 drivers]# insmod /lib/modules/adc...

ubuntu下中文输入法(ibus)的安装使用

ubuntu 下中文输入法(ibus)的安装安装ibus框架sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 qt4 - 启动ibus...

ARM Linux 设备树(1)

设备树的起源在过去的arm linux中,arch/arm/plat-xxx中mach-xxx中充满大量垃圾代码,多是描述板级细节的信息,在linus 一声怒喝之后,设备树衍生而出。设备树的组成和结构...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动开发错误:module license 'unspecified' taints kernel.
举报原因:
原因补充:

(最多只允许输入30个字)