netfilterを使用してWebフックを作成しました。モジュールは私のUbuntu 16.04で正常にコンパイルされます。
これで、カスタムLinuxを使用し、ラップトップで同じバージョンのカーネルを使用する組み込みボードでそれをコンパイルしたいと思います。唯一の問題は、私の組み込みボード上のすべてのモジュールがフォーマット.ko.xz
されており、メイクファイルが失敗し、問題を解決する方法がわからないということです。
私の元のメイクファイルは次のとおりです。
obj-m += sysfirewall.o
all:
make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) clean
しかし、組み込みLinuxでビルドフォルダが見つからないため失敗します。ビルドフォルダの代わりにカーネルフォルダがあり、カーネルに置き換えました。
今私のメイクファイルは次のようになります。
obj-m += sysfirewall.o
all:
make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) clean
ただし、現在のディレクトリで make を実行すると、次のエラーが発生します。
$ make -C /lib/modules/4.14.49-ti-r54/kernel -I/usr/Include/ M=/home/parsa/firewall/ modules
make[1]: Entering directory '/lib/modules/4.14.49-ti-r54/kernel'
make[1]: *** No rule to make target 'modules'. Stop.
make[1]: Leaving directory '/lib/modules/4.14.49-ti-r54/kernel'9-ti-r54/uname -i
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 2
この問題をどのように解決できますか?カーネル内のすべてのモジュールを解凍する必要がありますか?これは実際に圧縮されたLinuxカーネルモジュールの問題ですか、それともエラーが異なることを示していますか?
PS:私はこのモジュールを私のラップトップでクロスコンパイルしたくありません。
編集:私の組み込みボードにはない「/lib/modules/$(shell uname -r)/kernel」フォルダにMakefileがあるはずです。私のラップトップの "/lib/modules/$(shell uname -r)/build" フォルダで Make ファイルを追跡した結果、 /usr/src/linux-headers-4.4.0-128/ Makefile へのソフトリンクに移動するということに気づきました。 。しかし、私の組み込みボードには/ usr / srcには何もありません。だからこのモジュールをコンパイルするにはmakeファイルを見つける必要があるようですが、どうすればいいのかわかりません!
答え1
問題は、圧縮ではなくmake
正しいファイルが見つからないことです。 makeコマンドは/lib/modules/<kernel version>/kernel
ディレクトリに入った次のエラーを報告します。だからそこでは必要なものは何も見つかりません。
/lib/modules/<kernel version>/kernel
次に置き換えることはできません/lib/modules/<kernel version>/build
:内容が異なります。このkernel
ディレクトリには、特定のカーネルバージョンに付属のコンパイル済みモジュールが含まれています。これはコマンドには全く役に立ちません。カーネルソースに付属のmake
makefileとファイルが必要です。.h
これらのいくつかは、デフォルトのカーネルコンパイルの一部として動的に生成されます。
通常、/lib/modules/<kernel version>/build
特定のカーネルバージョンに関連するカーネルヘッダーの場所へのシンボリックリンクです。組み込みボードが「Debian 方式」でコンパイルされたカーネルを使用する場合 (つまり、カーネルソースディレクトリにカーネルmake bindeb-pkg
または類似のカーネルがある場合)、カーネルコンパイルプロセスで複数の.deb
パッケージを作成する必要があります。
linux-image-<version>_<patchversion>_<architecture>.deb
=実際にコンパイルされたカーネルとそのモジュールlinux-headers-<version>_<patchversion>_<architecture>.deb
=この特定のカーネル用のより多くのカーネルモジュールをコンパイルするために必要なヘッダ
この場合、linux-headers
ARMボードで使用されている正確なカーネルバージョンに対応するパッケージを見つけてインストールするだけです。これにより、自動的に/lib/modules/<kernel version>/build
リンクが提供されます。
レガシーまたは同様の手段を使用してカスタムカーネルをコンパイルした場合は、リンクを直接提供する必要がmake bzimage
あります。/lib/modules/<kernel version>/build
実際のカーネルビルドディレクトリがまだ利用可能な場合はこれを/lib/modules/<kernel version>/build
。