makeコマンドの後にコマンドを呼び出してsudo insmod example1.ko
パスワードを入力すると、次のエラーが発生します
insmod error: could not insert module example1.ko: Invalid module format
。私のUbuntuバージョンは5.8.0-44-generic
、example1.koバージョンはです5.8.0-38-generic
。たぶん、このバージョンは私のバージョンと同じでなければなりませんか? Makefileをからに/lib/modules/($ shell uname -r)/build
変更しようとしましたが、/lib/modules/5.8.0.-38-generic/build
まだ同じエラーが発生します。この問題を解決する方法がわかりません。
dmesg
コマンドを使用して問題に関する詳細情報を検索したところ、いくつかのエラーが見つかりました。
example1: version magic '5.8.0-38-generic SMP mod_unload' should be '5.8.0-44-generic SMP mod_unload'
同じ問題と2つのエラーがある6行がありますFailed to send host log message
。
私のMakefileは次のようになります。
obj-m := example1.o
default:
make -C /lib/modules/5.8.0-44-generic/build M=$(PWD) modules
clean
make -C /lib/modules/5.8.0-44-generic/build M=$(PWD) clean
走ったmake clean ; make
けど何も効かなかった。
答え1
この質問に対するコメントを通して、ここにまとめる解決策が生まれました。
OPはLinuxカーネルモジュールを構築しようとしました。間違ったバージョンのカーネルソース(つまり、実行中のカーネルとは異なるカーネルソースバージョン)用にビルドしました。これはバッファのログに表示されますdmesg
。
問題を解決するには、モジュールをロードするカーネルに対応するカーネルソースコードを指す必要があります。コマンドラインからこれを明示的に実行できます。
$ make -C <path_to_kernel_src> M=$PWD
またはMakefile
同じ機能を持つものを作成します。
正しいカーネルソースに対してビルドを試みる前に、以前のビルドの既存の成果物をすべてクリーンアップする必要があります。