Kreuz Kompilieren eines Kernel-Modul
-
28-09-2019 - |
Frage
Ich versuche Kompilierung zu überqueren ein Hello World-Kernel (2.6.x) Modul für ARM-Architektur auf meiner Intel-x86-Host.
Die CodeSourcery Werkzeugkette für ARM befindet sich unter: / home / Ravi / Arbeitsbereich / Falke / Arm-2009q3
Die Kernel-Quelle befindet sich unter: / home / Ravi / Arbeitsbereich / Falke / linux-omapl1
Meine Makefile:
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
Wenn ich laufe make , erzeugt die .ko ist, dass meiner Host-Maschine, die die Make-Datei bedeutet, wird die native Compiler Aufruf statt das Kreuz compiler.What mache ich falsch? Der Cross-Compiler der Binärdateien sind in meinem Weg.
Lösung
Putting ARCH
und CROSS_COMPILE
im Makefile funktioniert nicht. Sie müssen sie auf der Kommandozeile eingegeben werden:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
Andere Tipps
Ersetzen
ARCH = Arm
CROSS_COMPILE = arm-none-linux-gnueabi
durch
export ARCH: = Arm
Export CROSS_COMPILE: = arm-none-linux-gnueabi -
Dies wird auch funktionieren, wenn Sie nicht wollen, dass diese Parameter Befehlszeile jedes Mal geben.
Nebenbei bemerkt:. SUBDIRS=
wird zugunsten M=
veraltet
Sie könnten versuchen, vergessen Sie ARCH und CROSS_COMPILE in den Standard und sauber
hinzufügenARCH=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
Hinzufügen export
am Ende Ihres Makefiles Variablendeklarationen werden sie Subshells zur Verfügung stellen. und fügen Sie den Strich zum CROSS_COMPILE
Präfix wie JayM wies darauf hin, und M
statt SUBDIRS
wie user502515 beantwortet.
und es ist generell eine gute Idee, um den Einsatz :=
statt =
in einem Makefile, so dass nur die Variablen einmal interpoliert werden. wirklich spielt keine Rolle, in diesem speziellen Fall aber.
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
MODULES := hola_kern.o
#guest architecture
ARCH := arm
CROSS_COMPILE := arm-linux-gnueabi-
obj-m := $(MODULES)
#path of the arm compiled kernel
ROOTDIR := /home/aldo/c/proyectos/prefixa/work/kernels/linux-omap-5f0a6e2
MAKEARCH := $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
all: modules
modules:
$(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} modules
clean:
$(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} clean