26

Estoy intentando cruzar compilar un módulo helloworld kernel (2.6.x) para la arquitectura ARM en mi host intel x86.Compilación cruzada de un módulo kernel

la cadena de herramientas CodeSourcery para ARM se encuentra en: /home/ravi/espacio de trabajo/halcón/brazo-2009q3

La fuente del núcleo se encuentra en: /home/ravi/espacio de trabajo/halcón/Linux -omapl1

mi 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 

Cuando corro hacen, la .ko producido es el de mi máquina host que significa t El archivo make está invocando el compilador nativo en lugar del compilador cruzado. ¿Qué estoy haciendo mal? Los binarios del compilador cruzado están en mi camino.

+0

¿Podríamos ver el archivo Makefile de 'KDIR'? – Beta

Respuesta

29

Poner ARCH y CROSS_COMPILE en el archivo Makefile no funciona. Es necesario para ponerlos en la línea de comandos:

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

En una nota al margen, ¿podemos compilar un módulo sin escribir un archivo MAKE, simplemente usando los conmutadores gcc? – itisravi

+2

Estoy seguro de que podrías, pero no sería fácil. Agregue 'V = 1' a su línea de comandos cuando llame a make para ver cómo se llama a gcc. Eso es lo que tendrías que escribir en lugar de 'hacer ...' – JayM

+3

Como novicio de Linux de alguna manera, me pregunto por qué ARCH y CROSS_COMPILE están en algunos Makefiles si no funcionan de esa manera. – Patric

6

Nota al margen: SUBDIRS= está en desuso en favor de M=.

-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

Reemplazar

ARCH = brazo
CROSS_COMPILE = brazo-ninguno-linux-gnueabi

por ARCH

exportación: = brazo
CROSS_COMPILE exportación : = arm-none-linux-gnueabi-

esto también funcionará si no desea dar estos parámetros a la línea de comandos cada vez.

5

podría intentar, se le olvidó añadir ARCH y CROSS_COMPILE en el defecto y limpia

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

Esta es una buena respuesta, pero hay un error tipográfico aquí. KDIR y KERNELDIR deben ser del mismo nombre de variable. – Samuel

+0

@ Las observaciones de Samuel también se aplican a '$ CROSS_COMPILE' /' $ CROSS', creo que –

+0

Has perdido el guión y puedes usar 'CROSS_COMPILE' en lugar de' COMPILER'. – 0andriy

0

añadiendo export al final de sus declaraciones de variables Makefile se pondrá a disposición de subniveles. y agregue el guión al prefijo CROSS_COMPILE como JayM señalado, y M en lugar de SUBDIRS como user502515 respondido.

y generalmente es una buena idea usar := en lugar de = en un Makefile, por lo que la variable solo se interpola una vez. realmente no importa en este caso particular sin embargo.

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 
Cuestiones relacionadas