交叉编译一个linux模块for arm(raspberry Pi)

时间:2013-01-05 17:05:04

标签: arm kernel-module raspberry-pi cross-compiling

我试图使用crosstool-ng 1.15.3交叉编译一个(示例)linuxmodule for raspberryPi(arm)。

我得到了以下输出:

markus@markus-R55S:~/Desktop/speakerarm$ make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- 
make -C /lib/modules/3.2.0-35-generic-pae/build SUBDIRS=/home/markus/Desktop/speakerarm modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-35-generic-pae'
  CC [M]  /home/markus/Desktop/speakerarm/speaker.o
In file included from /usr/src/linux-headers-3.2.0-35-generic-pae/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/markus/Desktop/speakerarm/speaker.c:1:
include/asm-generic/int-ll64.h:11:29: fatal error: asm/bitsperlong.h: No such file or directory
compilation terminated.
make[2]: *** [/home/markus/Desktop/speakerarm/speaker.o] Error 1
make[1]: *** [_module_/home/markus/Desktop/speakerarm] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-35-generic-pae'
make: *** [default] Error 2

我猜包含路径有问题。我的Hostmachine有内核3.2.35,我的目标机器是3.2.27+。我的错是什么? Makefile包含以下内容:

obj-m   := speaker.o

KDIR    := /lib/modules/$(shell uname -r)/build
PWD     := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

2 个答案:

答案 0 :(得分:1)

要注意的几件事情:

  1. 你正在编译你的开发主机的linux源代码树 - 从-generic-pae post-fix判断可能不是内核主线。 ARM SoC更改需要很长时间才能进入主线,甚至更快进入其他非ARM内核分支。建议您找到SoC更改所在的内核树,并获取标记版本,例如3.2而不是head。

  2. 您是否为构建ARM内核配置了linux构建系统? e.g。

  3. export ARCH=arm

    make clean

    make rpi_defconfig

    如果没有,您的内核将配置为x86版本,/arch/arm文件夹中的标题将无法使用 - 即使您设置了ARCH

    尝试构建完整内核并确保在构建模块之前首先工作是一个好主意。

答案 1 :(得分:0)

下载内核3.2.27 rpi-3.3.27,并按照RPi_Kernel_Compilation

中提到的步骤操作