2013-02-11 72 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