使用来自目标ARM板的rootfs的内核头来交叉编译内核模块

时间:2013-04-05 09:16:19

标签: arm embedded-linux kernel-module archlinux

我有一个OLinuXino板。我下载了ArchLinux img文件(ArchLinuxARM-2013.02-olinuxino-rootfs.img)并使用dd将其写入SD卡并使用该卡启动了该板。我使用以太网将电路板连接到互联网并安装了gcc并使用pacman进行制作。我能够在电路板上为电路板构建用户空间程序。

ArchLinux SD卡映像已经在rootfs中有了内核头文件目录(/lib/modules/linux-3.7.2-2-ARCH/build)。所以我也能够在电路板上为电路板构建可加载的内核模块。

我有一台Ubuntu 12.04.1开发PC。我已经在它上面安装了用于ARM GNU / Linux的源代码CodeBench Lite(arm-2012.09-64-arm-none-linux-gnueabi.bin)。我能够在这台开发PC上交叉编译OLinuXino的用户空间程序,并通过SFTP将其传输到板上并在板上运行(使用ttyAMA0串行端口上的控制台)。

现在我想为OLinuXino板交叉编译内核模块。我之前已经为另一个自定义构建imx233板做了这个 - 在这种情况下,我已经配置了内核构建系统(LTIB),在构建映像后保持内核源和rootfs不变。这样我就可以指定内核头文件构建目录来交叉编译内核模块,并且它可以工作。

这次对于OLinuXino我没有构建源代码所以我将rootfs(使用cp -dR)复制到我的Ubuntu PC并尝试通过将内核头文件目录指定为/ lib / modules来交叉编译hello world内核模块/linux-3.7.2-2-ARCH/build并抛出以下错误:

anurag@anurag-VirtualBox:~/HelloKS$ make
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -C /mnt/ArchOL/lib/modules/3.7.2-2-       ARCH/build M=/home/anurag/HelloKS modules
make[1]: Entering directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
  CC [M]  /home/anurag/HelloKS/khello.o
/bin/sh: scripts/basic/fixdep: cannot execute binary file
make[2]: *** [/home/anurag/HelloKS/khello.o] Error 126
make[1]: *** [_module_/home/anurag/HelloKS] Error 2
make[1]: Leaving directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
make: *** [all] Error 2

脚本文件夹中的fixdep二进制文件是针对ARM预编译的,所以我删除了二进制文件并将其重新编译为x86并将其放在那里。当我尝试再次交叉编译内核模块时,抛出了一个类似的错误,抱怨脚本文件夹中的另一个可执行文件(这次是modpost)。

我的问题是如何用x86版本替换kernel-header / build文件夹中的这些arm二进制文件? build文件夹中是否有一个脚本来执行此操作?我可以用我的ubuntu内核模块构建文件夹中的脚本文件夹替换复制的ArchLinux中的脚本文件夹吗?或者我是否修改内核模块的makefile以指示构建脚本在脚本文件夹中重建二进制文件,或者为这个二进制文件使用不同的脚本文件夹(我会指定)在其内核头文件夹中指向ubuntu脚本文件夹的路径? 或者我是以错误的方式解决这个问题,并且有更好的方法来设置我的电路板和设置的交叉编译?

PS。仅供参考:交叉编译器使用libc 2.16,而OLinuXino的ArchLinux img上有libc 2.17

1 个答案:

答案 0 :(得分:0)

如果要编译x86,则应将内核头文件目录指定为/lib/modules/linux-3.7.2-2-ARCH/build。对于交叉编译,我们将下载linux源代码或使用SOC制造商提供的linux源代码。必须指定下载的linux源代码的内核头以进行编译。假设您在/ opt目录下下载了linux源代码,那么示例“Makefile”将如下所示

obj-m += name-of-driver.o  
make -C /opt/linux(specify full version) M=${PWD} modules

必须安装交叉编译器并导出export PATH=$PATH:<absolute-path-of-cross-compiler-binaries>。使用make实用程序进行编译时提供make ARCH=arm(Target for which you are compiling) CROSS_COMPILE=arm-none-linux-gnueabi-。一旦遵循所有这些过程,您将成功编译目标的内核模块。