26

Ich versuche, ein Helloworld Kernel (2.6.x) -Modul für ARM-Architektur auf meinem Intel x86-Host zu kompilieren.Kreuz kompilieren eines Kernel-Moduls

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

Mein 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 laufen zu lassen, erzeugt die .ko ist, dass meiner Host-Maschine bedeutet das t Das Makefile ruft den nativen Compiler anstelle des Cross Compilers auf. Was mache ich falsch? Die Binärdateien des Cross Compilers sind in meinem Pfad.

+0

Können wir das Makefile von 'KDIR' sehen? – Beta

Antwort

29

Putting ARCH und CROSS_COMPILE in das Makefile funktioniert nicht. Sie müssen sie auf der Kommandozeile eingegeben werden:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
+1

Nebenbei, können wir ein Modul kompilieren, ohne ein Makefile zu schreiben, nur mit gcc-Schaltern? – itisravi

+2

Ich bin mir sicher, du könntest es, aber es wäre nicht einfach. Fügen Sie Ihrer Befehlszeile 'V = 1' hinzu, wenn Sie make aufrufen, um zu sehen, wie gcc aufgerufen wird. Das musst du eintippen anstatt "machen ..."' – JayM

+3

Als ein irgendwie linux noob frage ich mich, warum ARCH und CROSS_COMPILE in einigen Makefiles sind, wenn sie nicht so funktionieren. – Patric

6

Nebenbei bemerkt: SUBDIRS= für M= veraltet.

-2
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 
17

Ersetzen

ARCH = Arm
CROSS_COMPILE = Arm-none-Linux-gnueabi

von

export ARCH: = Arm
export CROSS_COMPILE : = arm-nicht-linux-gnueabi-

Dies funktioniert auch, wenn Sie diese Parameterbefehlszeile nicht jedes Mal geben möchten.

5

könnten Sie versuchen, vergessen Sie ARCH und CROSS_COMPILE in den Standard und sauber

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 
+0

Dies ist eine gute Antwort, aber hier ist ein Tippfehler. KDIR und KERNELDIR müssen denselben Variablennamen haben. – Samuel

+0

@ Samuels Bemerkungen gelten auch für '$ CROSS_COMPILE' /' $ CROSS', ich glaube –

+0

Sie haben den Bindestrich vermisst und Sie können 'CROSS_COMPILE' anstelle von' COMPILER' verwenden. – 0andriy

0

Zugabe export am Ende Ihres Makefiles Variablendeklarationen hinzufügen wird sie Subshells zur Verfügung stellen. und fügen Sie den Strich zum CROSS_COMPILE Präfix als JayM hingewiesen, und M anstelle von SUBDIRS als user502515 beantwortet.

und es ist generell eine gute Idee, := statt = in einem Makefile zu verwenden, so dass die Variable nur einmal interpoliert wird. In diesem speziellen Fall spielt es allerdings keine Rolle.

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