2

カーネル ソース ツリーから usb-storage.ko (のみ) をコンパイルするにはどうすればよいですか?

実行中のカーネル バージョン: 2.6.35-22-generic(uname -r)

ソース バージョン:linux-2.6.35

  1. modprobe usb-storage実行すると、以下のエラーが発生します。

    FATAL: Error inserting usb_storage (/lib/modules/2.6.35-22-generic/kernel/drivers/usb/storage/usb-storage.ko): Invalid module format

  2. insmod実行すると、以下のエラーが発生します。

    insmod: error inserting 'drivers/usb/storage/usb-storage.ko': -1 Invalid module format

  3. dmesg以下のように与えます。

    usb_storage: no symbol version for module_layout

トップレベルの Makefile を変更して、カーネルの実行中のバージョンに挿入するにはどうすればよいですか?

Makefile (最上位)

バージョン = 2

パッチレベル = 6

サブレベル = 35

エクストラバージョン =

名前 = Meth の羊

4

1 に答える 1

4

insmodカーネルの開発中に、ローカルでビルドされたkoモジュールを ing する際に、これら 2 つのイライラするエラーに遭遇することがよくあります。


エラー 1:<module-name> no symbol version for module_layout

なんで?
これは、カーネル ソースがビルドされていないことを意味します。カーネル ソース全体がビルドさModules.symversれると、Linux カーネル ソースの最上位ディレクトリにファイルが生成されます。これには、シンボルのアドレスが含まれますmodule_layout。今後、これはカーネル モジュールがビルドされるときに使用されます。


完全なカーネル ソースをビルドしますModules.symversが生成され、記号の付いた行が含まれていることを確認しmodule_layout。続いてカーネルモジュールをビルドします。


エラー 2:<module-name> disagrees about version of symbol module_layout

なんで?
このエラーは、使用されているカーネル ソースが、起動に使用されるカーネル イメージのビルドに使用されたものと大幅に異なることを意味します。

モジュール
ファイルを 手動で変更して、ファイル内の値と、起動に使用されているカーネル イメージ内のko値を一致module_layoutko

そのためには、まず の有効な値を決定する必要がありますmodule_layout。これは基本的に、システム上に存在する有効な作業koファイルのそれぞれに存在します。この情報を取得する簡単な方法は、ko正常にロードされる有効なファイルから取得することです。lsmod潜在的な「working.ko」ファイルのリストを取得するために使用します。

# modprobe --dump-modversions <working.ko> | grep module_layout
0x0b11e775      module_layout
# modprobe --dump-modversions <your.ko> | grep module_layout
0x2719d41e      module_layout

注: ファイルにmodule_layoutシンボルのインスタンスがない場合は、ko次の手順に進む前に、まず手順に従って ERROR1 を修正してください。

お気に入りの 16 進エディタを使用して、ko ファイルの値 ( 4バイト) を見つけて、作業中の ko ファイルの値に置き換えます。

変更前:
00016c701e d4 19 276d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|

変更後:
00016c7075 e7 11 0b6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|


上記の変更により、insmodローカルにビルドされたkoファイルの ing は成功するはずです。

于 2013-07-02T10:01:59.160 に答える