2013-02-11 148 views
3

我试图从Linux x86机器上为ARM制作一个.ko文件。我想下面的Makefile:针对ARM架构的内核模块交叉编译

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 

...但我在命令提示符下给予make -f Makefile ARCH=arm CROSS_COMPILER=arm-linux-gnueabi-gcc如下得到了一个错误:

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 

我做了什么错?

回答

2

速战速决,变:

#include <asm/bitsperlong.h> 

到:

#include <asm-generic/bitsperlong.h> 
2

shell uname -r意味着这个Makefile将建立你的主机(x86)的系统,而不是用于ARM模块。

您需要指定ARM内核的源目录。你可以使用下面的Makefile来交叉编译你的模块。

的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