2013-02-26 7 views
5

Wyobraźmy sobie projekt, który musi zbudować dwa moduły jądra Linux, z następującym układzie źródeł drzewa:Budowanie out-of-drzewa moduły jądra systemu Linux, które podzielają plików obiektowych z eksportowanych symboli

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

common_data Plik obiektów .o należy dołączyć do obu modułów. Więc plik kbuild ten projekt wygląda tak:

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 

Buduje w porządku, jeśli nie ma eksportowane symbole (tj EXPORT_SYMBOL) w common_data.c pliku. Jednak, jeśli jest kilka symboli (eksportowane np some_func), a następnie MODPOST spowoduje ostrzeżenia takie jak:

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

to dlatego, że oba moduły współdzielonych plik Module.symvers. Możliwe jest utworzenie dwóch oddzielnych plików Kbuild w mod1/i mod2/katalogach, aby uniknąć tego ostrzeżenia, ponieważ wtedy będą dwa oddzielne pliki Module.symvers. Ale to doprowadzi do kolejnej kwestii - obiekt commond_data.o zostanie zbudowany dwa razy - pierwszy raz podczas kompilowania mod1.ko i drugi raz podczas kompilowania mod2.ko.

Czy są jakieś sposoby na zignorowanie tego ostrzeżenia podczas korzystania z pojedynczego pliku Kbuild lub w celu zapobiegania drugiej odbudowie pliku common_data.o podczas korzystania z dwóch oddzielnych plików Kbuild?

+2

Jeśli oba moduły wyeksportować samą nazwę symbolu, to nie byłoby możliwe, aby wstawić oba moduły do ​​jądra w jednym czasie. Czy tego chcesz? Zazwyczaj wspólna funkcjonalność, np. Eksportowany symbol, byłaby uwzględniana we własnym module. –

+0

Tak, wiem, że nie można wstawić obu jednocześnie, ale nie jest to wymagane. W moim przypadku mod1 i mod2 są celowo zaprojektowane w ten sposób. Zasadniczo, mod2 jest tym samym modułem mod1, ale z pewną dodatkową funkcjonalnością (np. Testy jednostkowe). –

+0

@AustinPhillips Jestem w tej samej sytuacji, ale jestem trochę niezdecydowany, aby po prostu zignorować wiadomości bez zrozumienia, dlaczego one występują. Czy ostrzeżenie jest czystym ostrzeżeniem (tj. Tylko po to, aby ostrzec Cię, że tylko jeden z tych modułów może być załadowany na raz)? –

Odpowiedz

0

Po pewnym majstrować przy systemie kbuild skończyło się wniosku, że najprostszym sposobem obsługi sytuacji jak ta, jest filtrowanie out komunikatów ostrzegawczych z make wyjścia w zewnętrznym makefile:

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

lub w/o rezygnacji STDERR i zgniecenia go na standardowe wyjście, ale to wymaga bash:

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