1. ホーム
  2. linux

[解決済み] insmod エラー: './hello.ko' を挿入: -1 無効なモジュール形式".

2022-02-05 17:11:55

質問

LDD3に従って最初のドライバモジュールであるhello worldモジュールを作成したところです。しかし、残念ながらこのようなエラーに遭遇しました。

insmod: error inserting './hello.ko': -1 Invalid module format.

Ubuntu 11.04でやっている、私の環境です。

$ uname -r
2.6.38-8-generic

こんな感じでカーネルソースを取得します。

sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$sudo apt-get install linux-source-2.6.38

私の /usr/src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2

そして、カーネルをコンパイルします。

$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules

そして、私のカーネルモジュールをコンパイルします。

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules

をMakefileに追加しました。

obj-m := hello.o

で、最後にモジュールを挿入すると

$sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format

dmesgで見つけたもの。

hello: disagrees about version of symbol module_layout

で、何が問題なんだ?

また、気がついたのですが linux-header is -2.26.38-generic とソースコードのバージョンが-2.26.38になっていますが、これが問題なのでしょうか? しかし、私は本当に linux-source-2.26.38-generic のパッケージがあります。

のステータスを更新しました。 lib/moduels/$(name -r)/build/Makefile のファイルが、私の実行中のカーネルバージョンを示していることがわかりました。

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2

そこで、linux-2.6.38.2をダウンロードしてコンパイルしてみましたが、やはり同じエラーです。

また、/boot/config-$(uname -r)に一行があることがわかりました。

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

どなたか、この意味をご存知でしょうか?私がビルドしているカーネルのコンフィグファイルには見当たりません。

解決方法を教えてください。

カーネルモジュールをビルドするカーネルと、モジュールを挿入するカーネルのバージョンは同じであるべきです。もし、このことに気を使いたくなければ、以下の Makefile を使ってください。

obj−m += hello−world.o

all:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
clean:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) clean

これで、ビルドしてモジュールを挿入してみることができます。

この行の前に、可能であればrootになることをお勧めします。

<ブロッククオート

$sudo cp /boot/config-2.6.38-8-generic ./.config

$su
#cp /boot/config-2.6.38-8-generic ./.config
#insmod hello_world.ko

また、以下の make ファイルを使用することもできます。

TARGET  := hello-world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc-3.0

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o