モジュールを圧縮すると、armv7lモジュールmakefileが失敗します。

モジュールを圧縮すると、armv7lモジュールmakefileが失敗します。

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ディレクトリには、特定のカーネルバージョンに付属のコンパイル済みモジュールが含まれています。これはコマンドには全く役に立ちません。カーネルソースに付属のmakemakefileとファイルが必要です。.hこれらのいくつかは、デフォルトのカーネルコンパイルの一部として動的に生成されます。

通常、/lib/modules/<kernel version>/build特定のカーネルバージョンに関連するカーネルヘッダーの場所へのシンボリックリンクです。組み込みボードが「Debian 方式」でコンパイルされたカーネルを使用する場合 (つまり、カーネルソースディレクトリにカーネルmake bindeb-pkgまたは類似のカーネルがある場合)、カーネルコンパイルプロセスで複数の.debパッケージを作成する必要があります。

  • linux-image-<version>_<patchversion>_<architecture>.deb=実際にコンパイルされたカーネルとそのモジュール
  • linux-headers-<version>_<patchversion>_<architecture>.deb=この特定のカーネル用のより多くのカーネルモジュールをコンパイルするために必要なヘッダ

この場合、linux-headersARMボードで使用されている正確なカーネルバージョンに対応するパッケージを見つけてインストールするだけです。これにより、自動的に/lib/modules/<kernel version>/buildリンクが提供されます。

レガシーまたは同様の手段を使用してカスタムカーネルをコンパイルした場合は、リンクを直接提供する必要がmake bzimageあります。/lib/modules/<kernel version>/build実際のカーネルビルドディレクトリがまだ利用可能な場合はこれを/lib/modules/<kernel version>/build

おすすめ記事