Кросс-компиляция модуля ядра - PullRequest
31 голосов
/ 12 августа 2010

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

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

Исходный код ядра находится по адресу: / home / ravi / workspace / hawk / linux-omapl1

MyMakefile:

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 для моей хост-машины, что означает, что make-файл вызывает собственный компилятор вместо кросс-компилятора. Что яделать неправильно?Двоичные файлы кросс-компилятора находятся у меня на пути.

Ответы [ 6 ]

34 голосов
/ 13 августа 2010

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

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
17 голосов
/ 22 января 2013

Заменить

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

на

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

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

6 голосов
/ 21 ноября 2010

Sidenote: SUBDIRS= устарела в пользу M=.

5 голосов
/ 09 июля 2014

не могли бы вы попробовать, вы забыли добавить 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 голосов
/ 15 июля 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
0 голосов
/ 01 апреля 2012
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
...