前言
今天我要來說說在Linux驅動開發中Makefile編寫規則的問題。其實這是驅動開發中的基礎性的問題,怪自己基礎不夠紮實啊,犯了這樣的低級錯誤。寫這篇文章讓自己鞏固一下基礎吧,唯有厚積,才能薄發!紮實的編程基礎,是一個底層軟件工程師應該具備的素質,這樣才能年薪百萬,迎娶白富美,走上人生巔峯!麻痹,老子又在意淫了,女朋友在哪裏都還不知道,說多了都是淚,言歸正傳!別裝逼了!講正事!
1 Linux驅動Makefile編寫規則介紹
1.1 Linux驅動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
2 驅動加載錯誤:module license 'unspecified' taints kernel
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。