2012-02-29 18 views
8

私は2つのカーネルモジュール(modAとmodB)を持っています。 modAはEXPORT_SYMBOL(symA)のシンボルをエクスポートし、modBはそれを使用します。私insmod MODBすべては私のMODBが正しくカーネルにリンクされており、機能symAが正しく呼び出され、正常に動作している場合エクスポートされたシンボルを使用するカーネルモジュールを構築する警告

#include "modA.h" 
... 
static int __init modB_init(void) 
{ 
    symA(10); 
} 
... 

... 
extern void symA(int param); 
... 

modB.c中:私はMODAのヘッダmodA.hを持っています。しかし、私がmodBをビルドすると、コンパイラは警告を発生させます:symA is undefined。 LKMは再配置可能なELFなので、なぜコンパイラがこの警告を発するのですか?どのようにこれを取り除くことができますか?

答えて

12

この問題は(そしてどのようにこの場合には正しくコンパイルする)時には、外部モジュールは、別の 外部モジュールからエクスポートされたシンボルを使用していますhttp://www.kernel.org/doc/Documentation/kbuild/modules.txt

に説明されています。 kbuildは、未定義のシンボルについての警告を吐き出すのを避けるために、すべてのシンボル を完全に知る必要があります。この状況では3つの解決策が存在します。

注:最上位のkbuildファイルを使用する方法が推奨されていますが、特定の状況では が実際的でない場合があります。

あなたはfoo.koがbar.koからシンボルを必要とする2つのモジュールfoo.koと bar.koを、持っている場合、あなたはその両方 共通のトップレベルのkbuildファイルを使用することができ、トップレベルのkbuildファイルを使用しますモジュールは同じビルドの でコンパイルされます。次のディレクトリレイアウトを考えてみましょう。

./foo/ <= contains foo.ko  ./bar/ <= contains bar.ko 

    The top-level kbuild file would then look like: 

    #./Kbuild (or ./Makefile):   obj-y := foo/ bar/ 

    And executing 

     $ make -C $KDIR M=$PWD 

    will then do the expected and compile both modules with   full 

いずれかのモジュールのシンボルの知識。

余分なModule.symversファイルを使用する外部モジュールが構築されると、 カーネルに定義されていないすべてのエクスポートシンボル を含むModule.symversファイルが生成されます。 bar.koのシンボルにアクセスするには、module.symversファイルをbar.ko のコンパイルからfoo.koが作成されているディレクトリにコピーします。モジュールのビルド中に kbuildが 外部モジュールのディレクトリにあるModule.symversファイルを読み込み、ビルドが完了すると、新しいシンボル が定義されていて、その一部ではない新しい Module.symversファイルが作成されますカーネルの

使用、それは他のモジュールから コピーModule.symversに非現実的である場合は、変数KBUILD_EXTRA_SYMBOLSを「作る」、あなたは、ビルドファイルにKBUILD_EXTRA_SYMBOLSへのファイルのスペース 区切りのリストを割り当てることができます。 シンボルテーブル の初期化中に、これらのファイルがmodpostによってロードされます。

+0

素晴らしい!私は逃しました。ありがとうゴッサマー! – MirkoBanchi

関連する問題