回答:
特に問題は、モジュールをビルドしたときに、カーネルソースツリーにおそらく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を好む傾向があります:)
カーネルに対応するlinux-headers
とlinux-source
パッケージの両方をインストールしてください。たとえば、カーネルの3.2.0-27-generic-pae
場合:
linux-headers-3.2.0-27-generic-pae
そして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)
、インストールされているパッケージのバージョン文字列と一致するように、それぞれを下に置き換える必要があります。
cd /usr/src/linux-source-$Version
そして、.tar.bz2アーカイブを所定の場所に解凍し、展開されたディレクトリにcdします。cp /boot/config-$(uname -r) .config
カーネルソースディレクトリにcp /usr/src/linux-headers-$(uname -r)/Module.symvers .
カーネルソースディレクトリにそれが終わったら、カーネルソースディレクトリで次のようにします。
make prepare
make scripts
make M=drivers/usb/serial
- M=
ニーズに合わせてパスを変更しますあいにく、私は特定のモジュールを作成する方法を知らずにそのままにしModule.symvers
ます。やってmake drivers/usb/serial/option.ko
、例えば、殺すModule.symvers
ファイルを、あなたはあなたの元の問題で終わります。M=
パラメーターを使用しても、それは強制終了されませんが、指定されたパスにあるすべてのモジュールをビルドする必要があります-そして、私はまだそれを回避する方法を見つけていません。
実行する前に、まったく同じカーネル構成を使用する必要がありますmake prepare
。また、ツリー外でビルドする場合は、現在実行中のカーネル(またはコンパイル時に実行していない場合はターゲットカーネル)と一致するまったく同じカーネルヘッダーに対してビルドする必要があります。