unknown symbol in module, or unknown parameter

4350 ワード

Linuxではドライバをロードする際、insmodコマンドを使用してドライバkoファイルをロードすることが多いが、ロードすると、pppoeのkoファイルをインポートし、insmod pppoeを使用するなどのエラーメッセージがポップアップすることがある.ko、次のように間違えました.
insmod: can't insert 'pppoe.ko': unknown symbol in module, or unknown parameter

この場合は挿入されたkoファイルが一般的で、依存する一部の関数で、カーネルのシンボルセットが存在しないため、koをロードするときに異常を報告します.
この場合、dmesgを使用してカーネルのリングバッファのエラーメッセージを表示し、詳細なエラーメッセージを参照できます.
dmesg | tail -n 20

エラーメッセージは次のとおりです.
...
[ 4599.864471] pppoe: Unknown symbol pppox_ioctl (err 0)
[ 4599.869983] pppoe: Unknown symbol ppp_input (err 0)
[ 4599.876623] pppoe: Unknown symbol unregister_pppox_proto (err 0)
[ 4599.883344] pppoe: Unknown symbol register_pppox_proto (err 0)
[ 4599.889546] pppoe: Unknown symbol pppox_unbind_sock (err 0)
[ 4599.896494] pppoe: Unknown symbol ppp_register_net_channel (err 0)

あとはプロンプトのエラー関数に基づいて、検索してそのkoに属していればいいので、このkoをインポートする前に依存するkoファイルをインポートします.
次に、見た人の分析で記録します.
----------------------------------------------------------------------------------------------------------------------------------------------------
問題分析の考え方:
一、コマンドでカーネルにこのカーネル記号があるかどうかを確認する
たとえばvar_があるかどうかを確認するset_integerというカーネル記号は、コマンドを入力します.
cat   /proc/kallsyms  | grep "var_set_integer"

カーネルにこの記号が含まれている場合は、関連する印刷情報が表示されます.そうしないと、印刷されません.
注意:/proc/kallsymsにはカーネル内のすべての記号が表示されますが、これらの記号は他のモジュールで参照できるものではありません(ほとんどできません)、記号のタイプが大文字のもの(例えばT、U).
二、modinfoを使用してカーネル関連情報を表示する
modinfoを使用してモジュール依存関係を決定し、シンボル呼び出しをさらに確認します.一部の組み込みシステムにはこのコマンドが含まれていない可能性があります.この場合、検索エンジンに移行してください.
[root@localhost sw_64-3_8]# modinfo linux-bcm-core.ko  filename:        linux-bcm-core.ko license:GPL//権限description:BCM Core Device Driver depends:linux-kernel-bde//linux-bcm-core.koはlinux-kernel-bdeに依存する.ko vermagic:       3.8.0-sw2f SMP mod_unload modversions//カーネルバージョン
三、ソースコードの中でエラー関数定義の場所を検索する
インポートしたkoソースコードで、エラー関数がEXPORT_を使用しているかどうかを確認します.SYMBOL、extern宣言があるかどうか
GPL宣言をするかどうかを確認します:MODULE_に変更しますLICENSE("GPL");
1.モジュールが他のモジュールに記号を出力して使用する必要がある場合は、次のマクロ定義を使用します:EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name);//GPLライセンスを含むモジュールにのみ使用されます.
マクロ定義が特殊な用途に拡張する、グローバルアクセスが望ましい変数の宣言であるため、シンボルはモジュールファイルのグローバル部分に出力されなければならない.この変数はモジュールの特殊な実行可能部分(ELFセグメント)に格納、カーネルはこの部分でロード時にモジュールから出力される変数を見つける. 
2. EXPORT_SYMBOLの使い方:1)モジュール関数定義後にEXPORT_を使うSYMBOL(関数名);2)関数を呼び出すモジュールでexternペアを使用して宣言する;3)関数を定義するモジュールを最初にロードし、関数を呼び出すモジュールをロードする.【モジュールのロード順序の前後の要件は、一般的にシンボル呼び出しに依存する】koモジュールをコンパイルして生成した後、insmodコマンドでこのモジュールをカーネルにロードします.このプログラムは、モジュールのコードセグメントとデータセグメントをカーネルにロードします.
次に、モジュール内の未解決のシンボルをカーネルのシンボルテーブルに接続する.
つまり、
【insmodは、モジュール内の未定義のシンボルを解析するために共通カーネルシンボルテーブルを使用する】共通カーネルシンボルテーブルには、すべてのグローバルカーネルアイテム(すなわち、関数および変数)のアドレスが含まれており、モジュール化ドライバを実現するために必要である.
また、図のように、自己モジュール内の任意のカーネルシンボルを共通カーネルシンボルテーブルにエクスポートすることもできます.
通常、モジュールは、シンボルをエクスポートすることなく、独自の機能を実装するだけです.ただし、他のモジュールがモジュールから利益を得る必要がある場合は、シンボルをエクスポートすることもできます.
四、モジュールディレクトリの下でModuleを表示する.Symvers、探している記号があるかどうか見てみましょう
Module.symvers contains a list of all exported symbols from a kernel build.  
Module.Symversには、エクスポートするすべてのリスト記号が含まれています.
 Module.Symvers fileの構文フォーマット:0 x 2 d 036834 scsi_remove_host     drivers/scsi/scsi_mod
カーネルコンパイルオプションCONFIG_MODVERSIONSがオフの場合、すべてのCRC値は0 x 00000000です.
補足:
  • Linuxモジュール間の通信方法は非常に多く、最も便利な方法は関数記号をエクスポートし、直接呼び出すことです.
  • 駆動もカーネル空間に存在し、その各関数には各変数に対応する記号があり、この記号はカーネル記号とも呼ばれ、それらは導出しない(EXPORT_SYMBOL)ことは自身のためにしか使用できず、導出後は共通となり、導出されたカーネル記号は私たちがよく言うカーネル記号テーブルである.insmodの時すべての関数がすべてカーネルの記号の表を得て対応する記号を探すのではありませんて、すべての駆動は自分の分配の空間の中で1部の記号の表が存在して、中にこの駆動の中で使う変数と関数のいくつかの記号についてあって、まず駆動はこの中で探して、もし見つからないことを発見したら共通のカーネルの記号の表の中で検索して、検索したらモジュールのロードに成功し、検索しないとモジュールのロードに失敗します.2.6カーネルのデフォルトでは、モジュールのロード後にモジュール内の非静的グローバル変数および非静的関数をカーネルシンボルテーブルに自動的にエクスポートすることはありません.マクロEXPORT_を明示的に呼び出す必要があります.SYMBOLがエクスポートできます.1つのモジュールでは、自身だけで自分の機能を実現できる場合、シンボルをエクスポートする必要はなく、他のモジュールでモジュールが提供する関数を使用する必要がある場合にのみ、エクスポート操作を行う必要があります.これにより,LKM[ロード可能モジュール(Loadable Kernel Module)]にアクセスされた各シンボル(関数名のような)もカーネルシンボルテーブルにリストされるため,カーネルシンボルテーブルを見るとLKM呼び出しの関数が見られる場合があり,このLKMが不正な目的であれば,このLKM.
  • を殺すことができる.
    参照先:
    http://lxr.free-electrons.com/source/Documentation/kbuild/modules.txt
    http://blog.csdn.net/macrossdzh/article/details/4601648
    http://secisland.blog.51cto.com/787880/319760