次のソース ツリーのレイアウトで、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 回目の再構築を防ぐ方法はありますか?