9

マシンでカーネル モジュールをビルドする際に問題が発生しています。モジュールをビルドするたびに、modpost は常にモジュールがゼロであると表示します。

MODPOST 0 modules

この問題をトラブルシューティングするために、テスト モジュール (hello.c) を作成しました。

#include <linux/module.h>       /* Needed by all modules */
#include <linux/kernel.h>       /* Needed for KERN_INFO */
#include <linux/init.h>         /* Needed for the macros */

static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}

static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}

module_init(hello_start);
module_exit(hello_end);

モジュールの Makefile は次のとおりです。

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean

自分のマシンでビルドすると、次の出力が得られます。

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
  CC [M]  /home/waffleman/tmp/mod-test/hello.o
  Building modules, stage 2.
  MODPOST 0 modules
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'

別のマシンでモジュールを作成すると、成功します。

make -C /lib/modules/2.6.24-27-generic/build M=/home/somedude/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-27-generic'
  CC [M]  /home/somedude/tmp/mod-test/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/somedude/tmp/mod-test/hello.mod.o
  LD [M]  /home/somedude/tmp/mod-test/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-27-generic'

modpost に関する関連ドキュメントを探しましたが、ほとんど見つかりませんでした。modpost がどのようにビルドするかを決定する方法を知っている人はいますか? 私が見逃している可能性のある環境はありますか?

ところで、ここに私が実行しているものがあります:

uname -a
Linux waffleman-desktop 2.6.32-27-generic #49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU/Linux

編集

以下は V=1 で実行された make です:

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (        \
    echo;                               \
    echo "  ERROR: Kernel configuration is invalid.";       \
    echo "         include/linux/autoconf.h or include/config/auto.conf are missing.";  \
    echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";  \
    echo;                               \
    /bin/false)
mkdir -p /home/waffleman/tmp/mod-test/.tmp_versions ; rm -f /home/waffleman/tmp/mod-test/.tmp_versions/*
make -f scripts/Makefile.build obj=/home/waffleman/tmp/mod-test
  gcc -Wp,-MD,/home/waffleman/tmp/mod-test/.hello.o.d  -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include  -Iinclude  -I/usr/src/linux-headers-2.6.32-27-generic/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include  -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack  -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)"  -D"KBUILD_MODNAME=KBUILD_STR(hello)"  -c -o /home/waffleman/tmp/mod-test/.tmp_hello.o /home/waffleman/tmp/mod-test/hello.c
  set -e ; perl /usr/src/linux-headers-2.6.32-27-generic/scripts/recordmcount.pl "i386" "32" "objdump" "objcopy" "gcc" "ld" "nm" "" "" "1" "/home/waffleman/tmp/mod-test/hello.o";
(cat /dev/null;   echo kernel//home/waffleman/tmp/mod-test/hello.ko;) > /home/waffleman/tmp/mod-test/modules.order
make -f /usr/src/linux-headers-2.6.32-27-generic/scripts/Makefile.modpost
  scripts/mod/modpost -m -a -i /usr/src/linux-headers-2.6.32-27-generic/Module.symvers -I /home/waffleman/tmp/mod-test/Module.symvers  -o /home/waffleman/tmp/mod-test/Module.symvers -S -w  -s
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
waffleman@waffleman-desktop:~/tmp/mod-test$ cat /home/waffleman/tmp/mod-test/modules.order
kernel//home/waffleman/tmp/mod-test/hello.ko
4

13 に答える 13

6

私は一日中、この正確な問題と戦っているコンピューターにくっついて過ごしました..OPのように不思議なことに消えてしまいました.

私は少なくとも私の経験からこのわずかな詳細を提供することができます: OP と同じ出力を取得し (make V=1 の場合)、print ステートメントを ${kernel_directory}/scripts/makefile.build に配置すると、obj-m が奇妙に NOT であることが示されました上記のように明確に入力されていても、メイクファイルを含めた後に設定されています。

「obj-m += hello.o」という行とその周りの行をいじってみました。最終的には魔法のように機能しました..最終的には以前とまったく同じに見えました. たぶん、オンラインのチュートリアルからそれらの行をコピーしたのに、何らかの無効な/間違った文字が含まれていたのでしょうか?

これに遭遇した人は、obj-m が実際に hello.o に設定されていることを確認して
ください。不思議なことにそうでない場合は、その行を削除し、Makefile 全体を破棄して、もう一度入力してください。

あまり役に立たないことはわかっています。何が起こったのか再現できたらいいのに!

于 2011-10-08T21:01:27.097 に答える
2

別のスレッドで、makefile の内容をコピーして貼り付けると、make の後の -C が間違った "-" 記号を使用していて、再入力する必要があることがわかりました。たまたま、上記の obj-m += ... 行がこれに該当します。その文字を有効にするには、その文字を再入力する必要があります。これは、hello world モジュールのチュートリアルに従っている人なら誰でも見つけられるはずです。

于 2015-09-19T21:31:44.867 に答える
1

Makefile の内容を PDF または HTML ドキュメントからコピーしたと思います。使用されるハイフンはやや奇妙です。makefile のハイフンを置き換えてみてください。それは魅力のように機能します。

于 2012-09-22T10:05:57.237 に答える
1

私はこの同じ問題に遭遇しました.GREP_OPTIONS環境変数を介してデフォルトのgrepオプションを変更したことが原因でした. 詳細は掘り下げませんでしたが、モジュールのビルド プロセスで、別の grep 出力 (ファイル名と行番号を含む) が気に入らなかったことがあります。GREP_OPTIONS 環境変数を削除すると、問題が修正されました。

于 2014-05-07T18:59:22.467 に答える
0

理論的なチェック (開発者の見た目) と実際のテストの両方に合格しているため、カーネル ビルド環境が失敗しているとしか思えません。

make -C /lib/modules/2.6.36-rc8-32-desktop/build M=/dev/shm modules
make[1]: Entering directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
make -C ../../../linux-2.6.36-rc8-32 O=/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop/. modules
  CC [M]  /dev/shm/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /dev/shm/hello.mod.o
  LD [M]  /dev/shm/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
于 2011-01-17T22:14:05.160 に答える
0

エラーは不思議なことに消えました。誰かがこれを引き起こす可能性のある考えを持っているなら. 次回があれば知りたいです。

于 2011-03-17T14:20:16.293 に答える
0

失敗したマシンでは、.config でモジュール サポートが無効になっていますか?

「make menuconfig」を実行して、モジュールのサポートが有効になっていることを確認してください。

于 2011-01-17T16:50:40.387 に答える
0

私も同じ問題を抱えていました。最後に、カーネルを再構築し、makefile を書き直しました。それはついに働いた。

主な理由は、make ARCH=arm の直後に次の行に M=$(PWD) モジュールがあったためだと思います...

于 2016-04-24T17:34:06.373 に答える
0

を配置することでこの問題を解決できました

obj-m += <module name>.o

Kbuildという名前の別のファイル。これが機能する理由については、Linux/documentation/kbuild/modules.txtを参照してください。

于 2015-12-29T02:03:43.130 に答える