saju
saju

Reputation: 31

Cross-compiling of kernel module for ARM architecture

I'm trying to make a .ko file for ARM from a linux x86 machine. I tried the following Makefile:

1 obj-m +=helloworldtest_module.o 
2 modules_install:
3     make ARCH=$(ARCH) CC=$(CROSS_COMPILER) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
4 clean:
5     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

... but I got an error on giving make -f Makefile ARCH=arm CROSS_COMPILER=arm-linux-gnueabi-gcc in command prompt as follows:

make ARCH=arm CC=arm-linux-gnueabi-gcc -C /lib/modules/3.2.0-29-generic/build M=/home/terenesas/sample modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-29-generic'
  CC [M]  /home/terenesas/sample/helloworldtest_module.o
In file included from /usr/src/linux-headers-3.2.0-29-generic/arch/arm/include/asm/types.h:4:0,
                 from include/linux/types.h:4,
                 from include/linux/list.h:4,
                 from include/linux/module.h:9,
                 from /home/terenesas/sample/helloworldtest_module.c:2:
include/asm-generic/int-ll64.h:11:29: fatal error: asm/bitsperlong.h: No such file or directory
compilation terminated.
make[2]: *** [/home/terenesas/sample/helloworldtest_module.o] Error 1
make[1]: *** [_module_/home/terenesas/sample] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-29-generic'
make: *** [modules_install] Error 2

What did I do wrong?

Upvotes: 3

Views: 12442

Answers (2)

microMolvi
microMolvi

Reputation: 664

shell uname -r means that this Makefile will build the module for you host(x86) system and not for ARM.

You need to specify the source directory of your ARM Kernel. You may use following Makefile to cross-compile your module.

Makefile:

CC=$(CROSS_COMPILE)gcc
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := modulename.o 

# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else

    KERNELDIR ?= /path/to/kernel/linux
    PWD  := $(shell pwd)

default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

Upvotes: 2

StarPinkER
StarPinkER

Reputation: 14271

A quick fix, change from:

#include <asm/bitsperlong.h>

to:

#include <asm-generic/bitsperlong.h>

Upvotes: 2

Related Questions