內核模塊若是引用到Linux內核中的符號,這個則不屬於模塊間的依賴,由於內核導出的符號自己就是供內核模塊所使用。本帖要討論的是在兩個獨立編譯的模塊A和B之間,B若是要引用A導出的符號,在Makefile中該如何把這一信息加入的問題。
絕大多數情形下,內核配置時能會啓用CONFIG_MODVERSIONS,這意味着不管是內核仍是內核模塊,在導出符號時都會爲該符號生成CRC校驗碼,這個校驗碼保存在Module.symvers文件中。
最多見的是,模塊會引用到內核導出的符號,此時模塊的Makefile沒有什麼特殊的地方。如今假設A導出一個符號A_sym,那麼A_sym的CRC校 驗碼會存在於A模塊所在目錄的Module.symvers文件中,若是B模塊引用到A模塊的A_sym符號,那麼是須要在它的'__versions' section中生成A_sym符號的校驗碼的,這個校驗碼直接取自於A模塊的Module.symvers文件。若是B模塊在編譯時從它的 Makefile中沒法得到這一信息,首先編譯階段就會產生一個WARNING,其次加載階段也會由於符號沒有CRC校驗碼而致使加載失敗。
此時咱們須要在B模塊的Makefile文件中加上下面一行,以告訴模塊的編譯工具鏈到何處查找A_sym符號的CRC校驗碼:
KBUILD_EXTMOD := A模塊所在的目錄
如此,modpost工具除了到內核所在目錄下查找外,還會到KBUILD_EXTMOD指定的目錄下查找Module.symvers,以肯定本模塊全部未定義符號的CRC值。
最後給一個具體的Makefile:
點擊(此處)摺疊或打開
obj-m := dep_on_A.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
KBUILD_EXTMOD := /home/dennis/workspace/Linux/book/kmodule/A_mod
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesshell