アーム ベースのボード用のドライバーをクロス コンパイルしようとしています。make ファイルでは、インクルード ファイルの検索パスは、ホスト マシンのカーネルのものです。つまり、ubuntu に付属の Linux ヘッダーを指しています。また、ホスト システム (i7/ubuntu) に存在するターゲット ボードのカーネル ソース ツリーもあります。私の質問は、クロス コンパイルに必要なインクルード パス (ネイティブ システムの Linux ヘッダー パスまたはボードのカーネル ソース ツリーへのパス) です。ドライバーを含むすべてのモジュールに同じことが当てはまりますか?
3 に答える
以下は、ツリー外のドライバーの Makefile です。指定されたアーキテクチャ、ツールチェーン、およびカーネル ディレクトリ:
ifneq ($(KERNELRELEASE),)
# We were called by kbuild
obj-m += fpgacam.o
else # We were called from command line
KDIR := path/to/your/target/kernel
PWD := $(shell pwd)
CROSS=arm-none-linux-gnueabi-
default:
@echo ' Building Cam drivers for 2.6 kernel.'
@echo ' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS) modules
install:
./do_install.sh *.ko
endif # End kbuild check
######################### Version independent targets ##########################
clean:
rm -f -r *.o *.ko .*cmd .tmp* core *.i
make がモジュール ディレクトリから呼び出されると、コマンド ライン パスが取得され、make は を使用してカーネル ディレクトリ ビルド システムにリダイレクトされますmake -C
。カーネル ビルド システムに別の変数が渡され、すべてのセットアップ (インクルード パス、ツールチェーンなど) を含むモジュール ディレクトリに戻り、モジュールをコンパイルします。この 2 回目の Makefile では、kbuild パスが取得され、モジュールがツリー内にあるかのようにビルドされます。
ビルドシステムのヘッダーを使用してコンパイルすることは非常に悪いニュースであり、バイナリの非互換性が微妙であり、ターゲットで一見奇妙なクラッシュとして現れる可能性があります。
すでに発見したように、カーネルはこれに対してすでに強化されており、間違ったヘッダーに対してビルドされたモジュールのロードを拒否します。パッチを含め、既存のカーネルと同じソース ツリーを使用してビルドする必要があります。この時点で、カーネル全体を再構築することもできます。
カーネル ツリーは自己完結型であるため、その場でクロス コンパイルするだけで機能します。ドライバーを追加する場合は、ツリー内でコンパイルするのがおそらく最も簡単です。
ユーザー空間コンポーネントを構築したい場合、2 つの解決策があります。
--sysroot=<dir>
オプションをに渡しますgcc
。ここで、<dir>
はターゲット システムのシステム ルートです。- デフォルトとして使用する gcc と binutils をビルドします。
sysroot
後者のアプローチは、Angstromが使用するものであり、お尻の痛みを大幅に軽減します。