26

Я пытаюсь перекрестно скомпилировать модуль helloworld kernel (2.6.x) для архитектуры ARM на моем хосте intel x86.Перекрестная компиляция модуля ядра

CodeSourcery цепь инструмент для ARM находится по адресу: /дома/Ravi/рабочее пространство/ястреб/арм-2009q3

Источник ядро ​​расположено по адресу: /дома/Ravi/рабочее пространство/ястреб/Linux -omapl1

Мой 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 

Когда я бегу сделать, то .ko производства является то, что моего хозяина машины, которая означает, что т он makefile вызывает собственный компилятор вместо перекрестного компилятора. Что я делаю неправильно? Бинарные файлы кросс-компилятора находятся на моем пути.

+0

Можем ли мы увидеть Makefile из 'KDIR'? – Beta

ответ

29

Ввод ARCH и CROSS_COMPILE в Makefile не работает. Вы должны поместить их в командной строке:

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

На стороне примечания, можем ли мы скомпилировать модуль без написания make-файла, просто используя gcc-переключатели? – itisravi

+2

Я уверен, что вы могли бы, но это было бы нелегко. Добавьте 'V = 1' в свою командную строку, когда вы вызываете make, чтобы узнать, как вызывается gcc. Это то, что вам пришлось бы вводить вместо 'make ...' – JayM

+3

Как-то linux noob Интересно, почему ARCH и CROSS_COMPILE находятся в некоторых Makefile, если они не работают именно так. – Patric

-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

Заменить

ARCH = рука
CROSS_COMPILE = рука-NONE-линукс-gnueabi

по

экспорта ARCH: = рука
экспорта CROSS_COMPILE : = arm-none-linux-gnueabi-

это также будет работать, если вы не хотите давать эту командную строку параметров каждый раз.

5

вы могли бы попробовать, вы забыли добавить 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 
+0

Это хороший ответ, но здесь есть опечатка. KDIR и KERNELDIR должны быть одинаковыми именами переменных. – Samuel

+0

@ Замечания Самуэля также применимы к '$ CROSS_COMPILE' /' $ CROSS', я считаю, –

+0

Вы пропустили тире, и вы можете использовать 'CROSS_COMPILE' вместо' COMPILER'. – 0andriy

0

добавления export в конце вашего Makefile объявления переменных сделает их доступными для подоболочек. и добавьте штрих к префиксу CROSS_COMPILE как JayM указал, и M вместо SUBDIRS, так как user502515 ответил.

и обычно рекомендуется использовать :=, а не = в Makefile, поэтому переменная получает интерполяцию только один раз. на самом деле это не имеет значения в данном конкретном случае.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^