2013-02-26 11 views
5
mit exportierten Symbole Objektdateien teilen

Stellen Sie sich ein Projekt, das zwei Linux-Kernel-Module bauen, muss mit dem folgenden Layout Baum Quellen:eine Out-of-tree Linux-Kernel-Module Der Aufbau, die

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

Die common_data .o Objektdatei muss in beiden Modulen enthalten sein. So kbuild Datei für dieses Projekt sieht ungefähr so ​​aus:

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 

Es baut in Ordnung, wenn es nicht exportierten Symbole (d EXPORT_SYMBOL) in common_data.c Datei. Aber, wenn es einige exportierten Symbole (z some_func) ist, dann wird MODPOST produzieren Warnungen wie:

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

Dies liegt daran, dass beide Module einzelne Module.symvers Datei teilen. Es ist möglich, zwei separate Kbuild-Dateien in den Verzeichnissen mod1/und mod2/zu erstellen, um diese Warnung zu vermeiden, da dann zwei separate Module.symvers-Dateien vorhanden sind. Aber das wird zu einem anderen Problem führen - commond_data.o Objekt wird zweimal erstellt - das erste Mal beim Kompilieren von mod1.ko und das zweite Mal beim Kompilieren von mod2.ko.

Gibt es Möglichkeiten, diese Warnung zu unterdrücken, wenn einzelne kbuild Datei oder an zweiter Stelle zu verhindern common_data.o-Datei neu erstellen, wenn die Verwendung von zwei separaten kbuild Dateien?

+2

Wenn die gleichen Symbolnamen exportieren beide Module, dann wäre es nicht möglich sein, beide Module in den Kernel auf einmal einzufügen. Ist es das was du willst? In der Regel werden allgemeine Funktionen, z. B. das exportierte Symbol, in einem eigenen Modul berücksichtigt. –

+0

Ja, ich weiß, dass es nicht möglich wäre, sie beide gleichzeitig einzufügen, aber das ist nicht erforderlich. In meinem Fall sind mod1 und mod2 auf diese Weise bewusst gestaltet. Grundsätzlich ist mod2 das gleiche Modul mod1, aber mit einigen zusätzlichen Funktionen (z. B. Komponententests). –

+0

@AustinPhillips Ich bin in der gleichen Situation, aber ich bin ein bisschen zögerlich, die Nachrichten einfach zu ignorieren, ohne zu verstehen, warum sie auftreten. Sind die Warnmeldungen reine Warnungen (d. H. Nur dort, um Sie zu warnen, dass nur eines dieser Module gleichzeitig geladen werden kann)? –

Antwort

0

Nachdem einige Bastelei mit kbuild System, das ich mit Abschluss endete, die eine direkteste Art und Weise Situation wie diese zu handhaben, filtern-out ist Warnmeldungen von make Ausgang im äußeren Make-Datei:

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

oder w/o STDERR zu opfern und in STDOUT Quetschen, aber es erfordert bash:

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