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?
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. –
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à). –
@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)? –