5

次のソース ツリーのレイアウトで、2 つの 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/ および mod2/ ディレクトリに 2 つの別個の Kbuild ファイルを作成して、この警告を回避することができます。これは、2 つの別個の Module.symvers ファイルが存在するためです。しかし、これは別の問題につながります - commond_data.o オブジェクトは 2 回ビルドされます - 最初は mod1.ko をコンパイルするとき、2 回目は mod2.ko をコンパイルするときです。

単一の Kbuild ファイルを使用するときにこの警告を抑制する方法、または 2 つの別個の Kbuild ファイルを使用するときに common_data.o ファイルの 2 回目の再構築を防ぐ方法はありますか?

4

1 に答える 1

0

Kbuildシステムをいじくり回した後、このような状況を処理する最も簡単な方法makeは、外部makefileの出力から警告メッセージをフィルターで除外することであるという結論に達しました。

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

または、STDERRを犠牲にしてSTDOUTに押し込むことはありませんが、次のものが必要bashです。

bash -c "$(MAKE) -C $(KDIR) M=$$PWD 2> >( grep -v '^WARNING:.*exported twice\. Previous export was in' )"
于 2013-03-01T09:01:48.407 に答える