Compilazione incrociata di un modulo del kernel
-
28-09-2019 - |
Domanda
Sto provando a compilare in modo incrociato un modulo del kernel helloworld (2.6.x) per l'architettura ARM sul mio host Intel x86.
La catena di strumenti codesourcery per ARM si trova in: /home/ravi/workspace/hawk/arm-2009q3
Il sorgente del kernel si trova in:/home/ravi/workspace/hawk/linux-omapl1
Il mio file make:
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
Quando corro Fare, il .ko prodotto è quello del mio computer host, il che significa che il makefile invoca il compilatore nativo anziché il compilatore incrociato. Cosa sto facendo di sbagliato?I binari del compilatore incrociato sono sul mio percorso.
Soluzione
Mettere ARCH
e CROSS_COMPILE
nel Makefile non funziona. Hai bisogno di metterli sulla riga di comando:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
Altri suggerimenti
Sostituire
ARCH = braccio
CROSS_COMPILE = braccio-nessuno-linux-gnueabi
da
export ARCH: = braccio
export CROSS_COMPILE: = braccio-nessuno-linux-gnueabi -
questo funziona anche se non si vuole dare a questi parametri da riga di comando ogni volta.
Nota a margine:. SUBDIRS=
è deprecato in favore di M=
potresti provare, hai dimenticato di aggiungere ARCH e CROSS_COMPILE al valore predefinito e pulire
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
aggiungendo export
alla fine delle vostre dichiarazioni di variabili Makefile li renderà disponibili per sottoshell. e aggiungere il trattino al prefisso CROSS_COMPILE
come JayM sottolineato, e M
invece di SUBDIRS
come user502515 risposta.
ed è generalmente una buona idea usare :=
piuttosto che =
in un Makefile, quindi la variabile unico viene interpolata una volta. in realtà non importa in questo caso particolare, però.
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