Linux驅動開發錯誤:module license 'unspecified' taints kernel.

前言

今天我要來說說在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。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章