2013-02-26 75 views
5

共享對象文件一個徹頭徹尾的樹Linux內核模塊試想一個項目,該項目需要建設兩個Linux內核模塊,與源樹的以下佈局:建設與導出符號

modules/ 
|--common/ 
| `--common_data.c 
|--mod1/ 
| `--mod1_main.c 
`--mod2/ 
    `--mod2_main.c 

的common_data .o對象文件需要包含在兩個模塊中。因此,對於這個項目的kbuild文件看起來是這樣的:

obj-m := mod1.o mod2.o 
mod1-y := mod1/mod1_main.o common/common_data.o 
mod2-y := mod2/mod2_main.o common/common_data.o 

它建立罰款,如果有在common_data.c文件不導出符號(即EXPORT_SYMBOL)。但是,如果有一些導出的符號(例如some_func),然後MODPOST會產生像警告:

WARNING: mod2: 'some_func' exported twice. Previous export was in mod1.ko 

這是因爲這兩個模塊共享單個Module.symvers文件。它可以創建在MOD1 /兩個獨立的kbuild文件和MOD2 /目錄,以避免此警告,因爲那樣的話會有兩個獨立的Module.symvers文件。編譯mod1.ko和第二遍的時候編譯mod2.ko.當第一次 - 但是,這會導致另一個問題 - commond_data.o對象將建成兩次

是否有使用單一的kbuild文件時或防止第二common_data.o文件的重建使用兩個單獨的kbuild文件時要禁止這種警告任何方式?

+2

如果兩個模塊輸出相同的符號名稱,那麼它是不可能在同一時間同時插入模塊到內核中。那是你要的嗎?通常,通用功能(例如您的導出符號)將被分解到其自己的模塊中。 – 2013-02-26 22:40:44

+0

是的,我知道這是不可能在同一時間插入他們兩個,但這不是必需的。在我的情況下,mod1和mod2是以這種方式故意設計的。基本上,mod2是相同的mod1模塊,但具有一些附加功能(例如單元測試)。 – 2013-02-27 09:32:28

+0

@AustinPhillips我在同樣的情況,但我有點猶豫簡單地忽略這些消息不理解爲什麼會發生。警告信息是純粹的警告信息嗎(即,只是警告您一次只能載入其中一個模塊)? – 2013-09-25 17:55:15

回答

0

後有的用的kbuild系統修修補補我結束了結論,即處理情況這樣一個最直接的方法,就是從make輸出濾波器出警告信息外生成文件:

$(MAKE) -C $(KDIR) M=$$PWD 2>&1 \ 
| grep -v '^WARNING:.*exported twice\. Previous export was in' 

或W/O犧牲STDERR並擠壓到標準輸出,但它需要bash

bash -c "$(MAKE) -C $(KDIR) M=$$PWD 2> >(grep -v '^WARNING:.*exported twice\. Previous export was in')"