2013-02-26 11 views
5

Immaginate un progetto, che ha bisogno di costruire due moduli del kernel Linux, con la seguente disposizione di fonti albero:Costruire un out-of-albero di moduli del kernel Linux che condividono file oggetto con simboli esportati

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

Il common_data Il file oggetto. deve essere incluso in entrambi i moduli. Quindi il file kbuild per questo progetto simile a questa:

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 

Costruisce bene se non c'è simboli non esportati (cioè EXPORT_SYMBOL) nel file common_data.c. Ma, se ci sono alcuni simboli esportati (per esempio some_func), quindi MODPOST produrrà avvertimenti come:

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

Questo perché entrambi i moduli condividono singolo file Module.symvers. È possibile creare due file Kbuild separati nelle directory mod1/e mod2/per evitare questo avviso, poiché in tal caso ci saranno due file Module.symvers separati. Ma questo porterà ad un altro problema: commond_data.o l'oggetto sarà costruito due volte - la prima volta durante la compilazione di mod1.ko e la seconda volta durante la compilazione di mod2.ko.

Esistono modi per sopprimere questo avviso quando si utilizza un singolo file Kbuild o per impedire la seconda ricostruzione del file common_data.o quando si utilizzano due file Kbuild separati?

+2

Se entrambi i moduli esportare lo stesso nome del simbolo, allora non sarebbe possibile inserire entrambi i moduli nel kernel in una sola volta. E 'questo quello che vuoi? Di solito, le funzionalità comuni, ad esempio il simbolo esportato, vengono prese in considerazione nel proprio modulo. –

+0

Sì, so che non sarebbe possibile inserirli entrambi allo stesso tempo, ma questo non è richiesto. Nel mio caso, mod1 e mod2 sono deliberatamente progettati in questo modo. Fondamentalmente, mod2 è lo stesso modulo mod1, ma con alcune funzionalità aggiuntive (ad es. Test di unità). –

+0

@AustinPhillips Sono nella stessa situazione, ma sono un po 'titubante nel ignorare semplicemente i messaggi senza capire perché si verificano. Il messaggio di avviso è un avvertimento puramente (ad esempio, solo lì per avvisare che è possibile caricare solo uno di questi moduli alla volta)? –

risposta

0

Dopo un po 'armeggiare con il sistema kbuild ho finito con la conclusione che il modo più semplice per gestire situazione come questa, è quello di filtrare-out messaggi di avviso da make uscita nel makefile esterno:

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

o w/o sacrificando STDERR e schiacciare in STDOUT, ma richiede bash:

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