1

アーム ベースのボード用のドライバーをクロス コンパイルしようとしています。make ファイルでは、インクルード ファイルの検索パスは、ホスト マシンのカーネルのものです。つまり、ubuntu に付属の Linux ヘッダーを指しています。また、ホスト システム (i7/ubuntu) に存在するターゲット ボードのカーネル ソース ツリーもあります。私の質問は、クロス コンパイルに必要なインクルード パス (ネイティブ システムの Linux ヘッダー パスまたはボードのカーネル ソース ツリーへのパス) です。ドライバーを含むすべてのモジュールに同じことが当てはまりますか?

4

3 に答える 3

2

以下は、ツリー外のドライバーの 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 パスが取得され、モジュールがツリー内にあるかのようにビルドされます。

于 2012-12-07T08:33:30.363 に答える
0

ビルドシステムのヘッダーを使用してコンパイルすることは非常に悪いニュースであり、バイナリの非互換性が微妙であり、ターゲットで一見奇妙なクラッシュとして現れる可能性があります。

すでに発見したように、カーネルはこれに対してすでに強化されており、間違ったヘッダーに対してビルドされたモジュールのロードを拒否します。パッチを含め、既存のカーネルと同じソース ツリーを使用してビルドする必要があります。この時点で、カーネル全体を再構築することもできます。

カーネル ツリーは自己完結型であるため、その場でクロス コンパイルするだけで機能します。ドライバーを追加する場合は、ツリー内でコンパイルするのがおそらく最も簡単です。

ユーザー空間コンポーネントを構築したい場合、2 つの解決策があります。

  1. --sysroot=<dir>オプションをに渡しますgcc。ここで、<dir>はターゲット システムのシステム ルートです。
  2. デフォルトとして使用する gcc と binutils をビルドします。sysroot

後者のアプローチは、Angstromが使用するものであり、お尻の痛みを大幅に軽減します。

于 2012-12-09T14:26:50.553 に答える