2015-11-16 3 views
6

私は新しいカーネルプログラミングです。insmodの後にsymbol symbol_nameのバージョンについての意見はありません

私のプロジェクト作業を実装するために、最新の安定したカーネル(v4.3)kernel.orgからダウンロードしました。

私はカーネルディレクトリからいくつかのファイルを自分のプロジェクトディレクトリにコピーしました。それに変更を加え、いくつかのコードを挿入しました。

それから私は、私はそれが正常にコンパイル以下のmakefile

obj-m := my_module.o 
my_module-objs := module_main.0 other_module1.o other_module2.o other_module3.o 

を使用していた

make -C /lib/modules/$(uname -r)/build M=$PWD modules 

を使用してSLES11 Linuxカーネルにコンパイル。 私は

insmod my_sample.ko 

を使用してカーネルに挿入しようとしたとき、それはシンボルのバージョンについては、次の

が不一致が助けてください

enter image description here

をSYMBOL_NAME示しました。おかげさまで

答えて

2

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

は、シンボルバージョンの問題を解決する

/usr/src/ofa-kernel 

ディレクトリからModule.symversファイルをコピーして、現在の作業ディレクトリにそれを貼り付けます。次に、モジュールを再度作成します。今度はinsmodは完全に正常に動作するはずです。

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

そして、あなたはModule.symversが見つからないか、それが空の場合は、その後、私は実行中のカーネルでは/ usr/src /ディレクトリからのsrcファイルをダウンロードしたcreate_Module.symvers.sh

+0

これを解決しようと努力しています。できます! – JC1

+0

私はubuntu 14.04で同じ問題を抱えています。/usr/src/of-kernal/defaultからのコピーは問題を解決しませんでした。/usr/src/ofa-kernelにはデフォルトのディレクトリが1つしかありません。カーネルとカーネル3.3を作成したmlnx-ofed-kernel-3.3を通してドライバをインストールしました。助けてください。ありがとう。 –

8

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

あなたは、2つのソリューションがあります:(。あなたはSLES上zypper install kernel-sourceまたは他のディストリビューションで同等のコマンドを使用して、それらをインストールすることができます)

  1. 現在実行しているカーネルのカーネルソースをダウンロードしてください
  2. コンパイルをし、オペレーティングシステムに4.3カーネルをインストールしてください。これについて助けが必要な場合は、別の質問をしてください(おそらく、ここではスーパーユーザーに属しています)。カーネルとglibcが密接に結合されていると、非常に古いCライブラリがある場合は新しいカーネルを実行できない可能性があることに注意してください。
+0

使用して作成します。その後、同じ編集を行いました。もう一度正常にコンパイルされましたが、.koファイルをinsmodしようとすると、上記のスナップショットに示されているものと同じバージョンの問題が表示されます。 カーネルのバージョン と insmodの-Vショー(モジュールのinit-toolsのバージョン3.11.1)(は、una​​me -rが3.0.76-0.11-デフォルトを示して) 助けてください。 – user3243499

+0

また 'cat/proc/version'を実行すると' Linuxバージョン3.0.76-0.11-default(geeko @ buildhost)(gccバージョン4.3.4 [gcc-4_3-ブランチリビジョン152973](SUSE Linux)) ' 。 どのバージョンを使用すればよいですか? – user3243499

+1

現在実行しているカーネルの下でモジュールを実行させたい場合は、そのカーネル(3.0)に対してコンパイルする必要があります。 SuSEからそのビルド用の元のカーネルソースを入手できるはずです。 –

2

M = $ PWDモジュールをビルド/ -C/libに/モジュール/ $(のuname -r)作り、 "$(のuname -r)" あなたは今実行しているカーネルのバージョンに対してコンパイルされていることを示していますヘッダを変更していなければ、現在のカーネルのモジュールをinsmodすることができます。

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

カーネルソースを変更した場合は、新しいカーネルを再コンパイルして、新しいカーネルでブートする必要があります。そうすれば、変更されたヘッダでカーネルモジュールをコンパイルすることができます。

+0

私はいくつかのデバイスドライバのヘッダーにいくつかの変更を加えたと思います。カーネルを再コンパイルするための最小限の手順を示すリンクを私に紹介できますか? '一度コンパイルすると、将来、開発の一環としてヘッダーを変更した場合、カーネルを再コンパイルする必要がありますか? ' – user3243499

+1

カーネルのコンパイルには通常、設定を変更してからビルドしてインストールします。私はこれを主にubuntuで行っていますが、SuSeではそれほど違いはありません。 SuSe https://www.howtoforge.com/kernel_compilation_suseでそれを行うためのステップがあるリンクがあります。カーネルヘッダーを変更して、カーネルモジュールに変更されたヘッダーを使用する場合は、カーネルを再コンパイルする必要があります。 – Randolf

1

あなたはagAinstの正しいカーネルを構築したようです。カーネルのコンパイル方法と関係があります。 (「Config_conversions」を参照)。試してみる--force

関連する問題