カーネルモジュールをビルドするときの obj-m リストのアセンブリファイル

カーネルモジュールをビルドするときの obj-m リストのアセンブリファイル

kexecをモジュールとしてビルドしようとしたときに奇妙な問題が発生しました。私のobj-mは次のようになります

obj-m += kexec.o machine_kexec.o relocate_kernel.o

makefile を実行すると、「relocate_kernel.o に必要なターゲット relocate_kernel.c を作成するルールがありません」というメッセージが表示されます。

アセンブリファイルを含めるようにどうすればいいですか?私はカーネルMakefileを見ましたが、私はそれに精通していませんが、.S> .oのルールがあるようです。私は間違っていますか?

答え1

いつものようにRTFMです。この質問に答えてここに滞在し、この問題が発生する可能性がある他の人を助けてください。 Linux Documentation Projectによると、obj-mを誤って使用していました。

時には、カーネルモジュールを複数のソースファイルに分割するのが合理的です。以下は、そのようなカーネルモジュールの例です。

[ソースファイル...]

最後にメイクファイル:

例2-10.ファイルの生成

obj-m += hello-1.o obj-m += hello-2.o obj-m += hello-3.o obj-m += hello-4.o obj-m += hello-5.o obj-m += startstop.o startstop-objs := start.o stop.o

すべて: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) モジュール

クリーンアップ: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Linuxカーネルモジュールプログラミングガイド:2.7。複数のファイルにまたがるモジュール

したがって、私のMakefileは次のようになります。

obj-m += kexecmod.o
kexecmod-objs:= kexec.o machine_kexec.o relocate_kernel.o

relocate_kernel.S を relocate_kernel.o にコンパイルします。

(kexecをモジュールにコンパイルしたい人にとっては、まだすべての依存関係を見つけることができませんでしたが、開始に過ぎません。)

関連情報