Кросс-компиляция модуля ядра

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

Цепочка инструментов исходного кода для ARM находится по адресу: /home/ravi/workspace/hawk/arm-2009q3.

Исходный код ядра находится по адресу:/home/ravi/workspace/hawk/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

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


person itisravi    schedule 12.08.2010    source источник
comment
Можем ли мы увидеть Makefile от KDIR?   -  person Beta    schedule 13.08.2010


Ответы (5)


Помещение ARCH и CROSS_COMPILE в Makefile не работает. Вам нужно поместить их в командную строку:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
person JayM    schedule 12.08.2010
comment
Кстати, можем ли мы скомпилировать модуль без написания make-файла, просто используя переключатели gcc? - person itisravi; 13.08.2010
comment
Я уверен, что вы могли бы, но это будет нелегко. Добавьте V=1 в свою командную строку при вызове make, чтобы увидеть, как вызывается gcc. Это то, что вам нужно было бы ввести вместо make ... - person JayM; 13.08.2010
comment
Как новичок в Linux, мне интересно, почему ARCH и CROSS_COMPILE находятся в некоторых файлах Makefile, если они не работают таким образом. - person Patric; 12.12.2013
comment
Вместо командной строки его также можно экспортировать либо из командной строки, либо из make-файла формы. - person GeekyJ; 14.03.2016
comment
@itisravi вы пытались скомпилировать модуль без написания make-файла. то есть просто с помощью gcc - person GShaik; 22.08.2016
comment
@AbdulGafoor Нет, насколько я знаю, kbuild работает только с make-файлами. - person itisravi; 22.08.2016

Заменять

ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi

by

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

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

person raj_gt1    schedule 22.01.2013

Примечание: SUBDIRS= устарело в пользу M=.

person user502515    schedule 21.11.2010

не могли бы вы попробовать, вы забыли добавить 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
person Albert Chen    schedule 08.07.2014
comment
Это хороший ответ, но здесь опечатка. KDIR и KERNELDIR должны иметь одно и то же имя переменной. - person Samuel; 02.01.2015
comment
Замечания @Samuel также относятся к $CROSS_COMPILE/$CROSS, я полагаю - person Janus Troelsen; 07.01.2015
comment
Вы пропустили тире и можете использовать CROSS_COMPILE вместо COMPILER. - person 0andriy; 16.07.2017

добавление 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
person jcomeau_ictx    schedule 15.07.2017