usbhid.koをロードしようとすると、「module_layoutのシンボルバージョンがありません」


27

のために独自のモジュールを作成しようとしていますがusbhid.ko、コンパイルした後、モジュールをロードできません。dmesgと言うno symbol version for module_layout。何が問題なのでしょうか?すでにUbuntuが提供するカーネルソースを使用しており、カーネルバージョンが同じであることも確認しています。

回答:


22

特に問題は、モジュールをビルドしたときに、カーネルソースツリーにおそらくModules.symversファイルがなかったことです。モジュールをビルドすると、kbuildシステムは実際にこれについて警告します。Modules.symversが欠落している場合、以下が表示されます。

警告:シンボルバージョンダンプ/usr/src/linux-2.6.34-12/Modules.symversがありません。モジュールには依存関係とmodversionはありません。

カーネルがCONFIG_MODVERSIONS有効になっている場合、ドライバーのビルドのmodpostフェーズで、-mオプションを指定してscripts / mod / modpostを実行します。勇気があり、scripts / mod / modpost.cソースを見ると、-mオプションがvmlinuxから_module_layout_シンボルを追加することがわかりますが、カーネルからModules.symversがない場合は、このシンボルのCRC値を取得できず、このエラーメッセージが表示されます。

そのため、これには2つの方法があります。

1)実行中のカーネルのフルビルドを実行してModules.symversを生成し、モジュールを再構築します。[http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt][1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2)もう1つのオプションは、愚かなmodprobeにすべてのがらくたを無視して、とにかくモジュールをロードするように指示することです:

modprobe -f <module>

私はオプション2を好む傾向があります:)


1
+1「愚かなmodprobeにすべてのがらくたを無視して、とにかくモジュールをロードするように言ってください」というコメントに対して。
ハイリウグールコルトゥック

2を試してみたところ、起動時にモジュールが自動的にロードされないことがわかりました。ブート時に-fを実行する方法はありますか?
ジャスティンチャン

17

カーネルに対応するlinux-headerslinux-sourceパッケージの両方をインストールしてください。たとえば、カーネルの3.2.0-27-generic-pae場合:

  1. linux-headers-3.2.0-27-generic-pae そして
  2. linux-source-3.2.0-27-generic-pae

上記のパッケージのバージョンが実行中のカーネルバージョンと一致しない場合、$(uname -r)インストールされている上記のカーネルパッケージのバージョン文字列で置き換える必要があります。
上記の例では、パッケージのバージョンは3.2.0-27-generic-paeです。実行uname -rしてその出力が異なる場合3.2.0-27-generic-pae$(uname -r)、インストールされているパッケージのバージョン文字列と一致するように、それぞれを下に置き換える必要があります。

  1. cd /usr/src/linux-source-$Version そして、.tar.bz2アーカイブを所定の場所に解凍し、展開されたディレクトリにcdします。
  2. cp /boot/config-$(uname -r) .config カーネルソースディレクトリに
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . カーネルソースディレクトリに

それが終わったら、カーネルソースディレクトリで次のようにします。

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- M=ニーズに合わせてパスを変更します

あいにく、私は特定のモジュールを作成する方法を知らずにそのままにしModule.symversます。やってmake drivers/usb/serial/option.ko、例えば、殺すModule.symversファイルを、あなたはあなたの元の問題で終わります。M=パラメーターを使用しても、それは強制終了されませんが、指定されたパスにあるすべてのモジュールをビルドする必要があります-そして、私はまだそれを回避する方法を見つけていません。


あなたが同じツリーバージョンでモジュールをコンパイルしている場合にはこれは...、物事を行うための最善の方法だ
トレビノ

2

実行する前に、まったく同じカーネル構成を使用する必要がありますmake prepare。また、ツリー外でビルドする場合は、現在実行中のカーネル(またはコンパイル時に実行していない場合はターゲットカーネル)と一致するまったく同じカーネルヘッダーに対してビルドする必要があります。


「make mrproper」、「cp / boot / config-$(uname -r).config」、「make oldconfig」、「make prepare」、「make scripts」これらの指示を使用してコンパイルを準備しました。正しい構成ファイルをコピーしたかどうかを知りたいですか?/ boot /のカーネルバージョンに一致する設定が1つしかないようです。コメントボックスにフォーマットがないため、フォーマットについては申し訳ありません
。...– SpecC

はい、それは正しいようです。ビルドをどこで呼び出しますか。トップレベルディレクトリからではない場合、どのSUBDIRS値を渡しますか?
ダニエルTチェン

返信いただきありがとうございます。usbhid.koをビルドしようとしたとき。私は、「メイクモジュールSUBDIRS =ドライバ/ HID / USBHID」このコマンドを使用
SpecC言語

コマンド「make modules SUBDIRS = drivers / hid / usbhid」を実行すると、次の警告が表示されます。「警告:Symbol version dump /usr/src/linux-source-2.6.31/Module.symvers is missing; modules has依存関係のないとMODVERSIONS」。
SpecCを

@SpecC問題を調査する際、実行中の手順で元の質問を更新します。その後、ダンは回答を更新しますが、最終的に埋もれてしまう一連のコメントではなく、それがわかるまで更新を続けます。詳細についてはガイドを参照してください:meta.askubuntu.com/questions/257/how-does-ask -ubuntu-work
ホルヘカストロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.