Cross compiling a kernel module
Asked Answered
L

6

33

I'm trying to cross compile a helloworld kernel (2.6.x) module for ARM architecture on my intel x86 host.

The codesourcery tool chain for ARM is located at: /home/ravi/workspace/hawk/arm-2009q3

The kernel source is located at :/home/ravi/workspace/hawk/linux-omapl1

My 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

When i run make, the .ko produced is that of my host machine which means the makefile is invoking the native compiler instead of the cross compiler.What am I doing wrong? The cross compiler's binaries are in my path.

Luxe answered 12/8, 2010 at 12:56 Comment(1)
Could we see the Makefile from KDIR?Lympho
D
35

Putting ARCH and CROSS_COMPILE in the Makefile doesn't work. You need to put them on the command line:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
Dues answered 12/8, 2010 at 20:16 Comment(6)
On a side note, can we compile a module without writing a makefile, just by using gcc switches?Luxe
I'm sure you could, but it wouldn't be easy. Add V=1 to your commandline when you call make to see how gcc is called. That's what you'd have to type in instead of make ...Dues
As a somehow linux noob I wonder why ARCH and CROSS_COMPILE are in some Makefiles if they don't work that way.Frug
Instead of command line, It can be exported also either from command line or form makefileCorelli
@Luxe have you tried to compile a module without writing a makefile. i.e just by using gccElectrothermal
@AbdulGafoor No, AFAIK, kbuild works only with makefiles.Luxe
C
20

Replace

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

by

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

this will also work if you do not want to give these parameter command line each time.

Capsulate answered 22/1, 2013 at 11:21 Comment(0)
E
7

Sidenote: SUBDIRS= is deprecated in favor of M=.

Erinaceous answered 21/11, 2010 at 13:49 Comment(0)
S
5

could you try, you forgot to add ARCH and CROSS_COMPILE into the default and clean

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
Stratovision answered 8/7, 2014 at 22:33 Comment(3)
This is a good answer but there's a typo here. KDIR and KERNELDIR need to be the same variable name.Cupped
@Samuel's remarks also apply to $CROSS_COMPILE/$CROSS, I believeDianemarie
You missed dash and you can use CROSS_COMPILE instead of COMPILER.Vannavannatta
P
1

adding export at the end of your Makefile variable declarations will make them available to subshells. and add the dash to the CROSS_COMPILE prefix as JayM pointed out, and M instead of SUBDIRS as user502515 answered.

and it's generally a good idea to use := rather than = in a Makefile, so the variable only gets interpolated once. really doesn't matter in this particular case though.

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
Pun answered 15/7, 2017 at 15:19 Comment(0)
S
-1
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
Slick answered 1/4, 2012 at 5:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.