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_layout
ko
そのためには、まず の有効な値を決定する必要があります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 ファイルの値に置き換えます。
変更前:
00016c70
1e d4 19 27
6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
変更後:
00016c70
75 e7 11 0b
6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
上記の変更により、insmod
ローカルにビルドされたko
ファイルの ing は成功するはずです。