在《Linux設備驅動程式》一書中讀到的內核模塊編譯Makefile,不是非常理解,在查詢很多資料後,在這裡做個總結。 書中Makefile代碼: 代碼解析: 1. 判斷變數KERNELRELEASE是否設置,該變數在linux內核頂層Makefile中會被設置。當然第一次執行makefile時,K ...
在《Linux設備驅動程式》一書中讀到的內核模塊編譯Makefile,不是非常理解,在查詢很多資料後,在這裡做個總結。
書中Makefile代碼:
1 ifneq ($(KERNELRELEASE),) 2 obj-m:=hello.o 3 else 4 KDIR := /lib/modules/$(shell uname -r)/build 5 PWD:=$(shell pwd) 6 all: 7 make -C $(KDIR) M=$(PWD) modules 8 clean: 9 rm -f *.ko *.o *.symvers *.cmd *.cmd.o 10 endif
代碼解析:
1. 判斷變數KERNELRELEASE是否設置,該變數在linux內核頂層Makefile中會被設置。當然第一次執行makefile時,KERNELRELEASE未被設置
2. 進入else分支,設置KDIR變數為linux內核源代碼路徑,PWD為makefile文件所在的路徑
3. 執行目標all,命令先執行到make -C $(KDIR),此時,makefile跳轉到內核源碼頂層,執行所在目錄的makefile
4. 命令執行到M=$(PWD),此時回到內核模塊makefile所在的路徑,第二次執行該makefile,此時KERNELRELEASE已經在執行內核頂層Makefile時被賦值,因此obj-m:=hello.o被執行
5. 內核將hello.o鏈接成hello.ko,得到我們需要的內核模塊
編譯多文件:
若內核模塊由多個源文件,正確的寫法為:
obj-m:=hello.o
hello-objs:=file1.o file2.o file3.o