LDD3中第一個程序MAKEFILE的學習

參考:關於linux內核模塊Makefile的解析

MAKEFILE全部內容

#DEBUG = y

ifeq ($(DEBUG),y)
	DEBFLGAS = -O -g -DSCULL_DEBUG
else 
	DEBFLAGS = -O2
endif

CFLAGS += $(DEBFLAGS)
CFLAGS += -I$(LDDINC)

ifneq ($(KERNELRELEASE),)
scull-objs := main.o pipe.o access.o
obj-m := scull.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
	$(CC) $(CFLAGS) -M *.c > .depend
ifeq(.depend,$(wildcard .depend))
include .depend
endif

執行過程分析

在構造過程中,該MAKEFILE被讀取兩次,當在命令行輸入‘make’之後,此時KERNELRELEASE還未設置,MAKEFILE裏面可以有多個目標,如果在命令行中沒有指定make的目標,那麼執行第一條帶冒號的語句。在這裏執行modules目標

$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules

這裏轉入執行/usr/src/linux下的MAKEFILE,在執行過程中,KERNELRELEASE就會被定義,所以執行:

scull-objs := main.o pipe.o access.o
obj-m := scull.o

最終生成scull.ko。
.ko文件和.o文件相比。o的文件是object文件,.ko是kernel object,與.o的區別在於其多了一些sections,比如.modinfo。.modinfo section是由kernel source裏的modpost工具生成的,包括MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE, device ID table以及模塊依賴關係等等。depmod 工具根據.modinfo section生成modules.dep, modules.*map等文件,以便modprobe更方便的加載模塊。

?=符號講解

?=pattern,在任何匹配pattern的字符串開始處匹配查找字符串,比如正則表達式是‘abc(?=1234)’,那麼當輸入‘abc1234’時輸出test,因爲匹配到了‘1234’,當輸入‘abc123’時沒有輸出,因爲沒有匹配到1234。

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