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