web-dev-qa-db-ja.com

カーネルモジュールのクロスコンパイル

インテルx86ホストでARMアーキテクチャ上のhelloworldカーネル(2.6.x)モジュールをクロスコンパイルしようとしています。

ARMのコードソースツールチェーンは、次の場所にあります。/ home/ravi/workspace/hawk/arm-2009q

カーネルソースは次の場所にあります:/ home/ravi/workspace/hawk/linux-omapl1

私のメイクファイル:

Arch=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
default:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
          $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

makeを実行すると、生成される.koはホストマシンの.koになります。これは、メイクファイルがクロスコンパイラではなくネイティブコンパイラを呼び出すことを意味します。クロスコンパイラのバイナリは私のパスにあります。

31
itisravi

ArchCROSS_COMPILEがMakefileで機能しません。それらをコマンドラインに配置する必要があります。

make Arch=arm CROSS_COMPILE=arm-none-linux-gnueabi-
34
JayM

交換

アーチ=腕
CROSS_COMPILE = arm-none-linux-gnueabi

沿って

arch:= armをエクスポート
export CROSS_COMPILE:= arm-none-linux-gnueabi-

これは、毎回これらのパラメーターコマンドラインを指定したくない場合にも機能します。

17
raj_gt1

サイドノート: SUBDIRS=は廃止され、M=

6
user502515

試してみてください、ArchとCROSS_COMPILEをデフォルトに追加して、きれいにするのを忘れました

Arch=arm
COMPILER=arm-none-linux-gnueabi
obj-m := Hello.o
KERNELDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) Arch=$(Arch) CROSS_COMPILE=$(COMPILER) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) Arch=$(Arch) clean
5
Albert Chen

makefile変数宣言の最後にexportを追加すると、サブシェルで使用可能になります。そして、ダッシュをCROSS_COMPILE接頭辞に JayM 指摘として追加し、Mの代わりにSUBDIRSとして ser502515 回答します。

makefileで:=ではなく=を使用することをお勧めします。したがって、変数は1回だけ補間されます。しかし、この特定のケースでは実際には問題ではありません。

Arch := arm
CROSS_COMPILE := arm-none-linux-gnueabi-
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
export
default:
          $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
          $(MAKE) -C $(KDIR) M=$(PWD) clean
0
jcomeau_ictx