Cross-compiling a kernel module for ARM architecture
I am trying to create 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 make -f Makefile ARCH=arm CROSS_COMPILER=arm-linux-gnueabi-gcc
on the command line:
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 have I done wrong?
+3
source to share
2 answers
shell uname -r
means that this Makefile will build the module for your host system (x86), not ARM.
You need to point to the source directory of your ARM kernel. You can use the 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
+2
source to share