GNU/Linux >> Linux の 問題 >  >> Linux

insmod 後のシンボル symbol_name のバージョンに関する不一致

実行するカーネルと同じバージョンのカーネルに対してカーネル モジュールをビルドする必要があります。したがって、ダウンロードしたカーネル 4.3 ソースがある場合は、それをコンパイルする必要があります カーネルのバージョンを確認し、カーネルをロードする前にそのバージョンで起動してください。

2 つの解決策があります:

<オール>
  • 現在実行しているカーネルのカーネル ソースをダウンロードします (zypper install kernel-source でインストールできます)。 SLES または他のディストリビューションの同等のコマンド)
  • 4.3 カーネルをコンパイルしてオペレーティング システムにインストールします。これについて助けが必要な場合は、別の質問をしてください(おそらく、ここではなくスーパーユーザーに属しています)。カーネルと glibc が密結合している場合、非常に古い C ライブラリを使用している場合、新しいカーネルを実行できない可能性があることに注意してください。

  • make -C /lib/modules/$(uname -r)/build M=$PWD modules,"$(uname -r)" は、現在実行しているカーネル バージョンに対してコンパイルしていることを示しているため、insmod を実行できるはずです。ヘッダーを変更していない場合は、現在のカーネルのモジュール。

    あなたのテキストから、「確認のため、カーネル ディレクトリからプロジェクト ディレクトリにいくつかのファイルをコピーしました。それに変更を加え、さらにいくつかのコードを挿入しました。」

    カーネル ソースに変更を加えた場合は、新しいカーネルを再コンパイルし、新しく更新されたカーネルで起動する必要がある場合があります。その後、変更されたヘッダーでカーネル モジュールをコンパイルできるはずです。


    ここでの問題は、カーネル モジュールが他のカーネル モジュールのエクスポートされたシンボルを使用していることです。この場合、Linux InfiniBand RDMA スタックのエクスポートされたメソッドまたはシンボルのように見えます。

    シンボル バージョンの問題を解決するには、Module.symvers をコピーします。

    からのファイル
    /usr/src/ofa-kernel
    

    ディレクトリに移動し、現在の作業ディレクトリに貼り付けます。次に、モジュールを再度作成します。今度は insmod

    <ブロック引用>

    注:Module.symvers ファイルには、kernelmodule でエクスポートされたすべてのシンボルの情報が含まれています。したがって、それを作業ディレクトリにコピーすることで、kbuild が使用されているエクスポートされたシンボルについて詳しく知ることができます。

    Module.symvers が見つからないか空の場合は、create_Module.symvers.sh を使用して作成します


    Linux
    1. Linux – Linuxの汚染されたカーネル?

    2. Dpkgでカーネルアップデートをブロックしますか?

    3. Ksplice の有効なカーネル バージョンについて

    1. ioctl() を使用してカーネル モジュールを操作するにはどうすればよいですか?

    2. コンパイルされたカーネルモジュールのバージョンを見つける方法は?

    3. Linux カーネルモジュールのコーディング方法は?

    1. CLion で Linux カーネルモジュールを開発することは可能ですか?

    2. Linux カーネル バージョン 4.12.8 で copy_to_user が定義されていない

    3. 起動時にカーネル モジュールをスキップする