我有一个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 (arm-2012.09-64-arm-none-linux-gnueabi.bin) 的 Sourcery CodeBench Lite。我能够在这台开发 PC 上交叉编译 OLinuXino 的用户空间程序,并通过 SFTP 将其传输到板上并在板上运行(通过 ttyAMA0 串行端口使用控制台)。
现在我想为 OLinuXino 板交叉编译内核模块。我之前为另一个自定义构建 imx233 板完成了此操作 - 在这种情况下,我已配置内核构建系统 (LTIB) 以在构建映像后保持内核源和 rootfs 完好无损。这样我就能够指定内核头文件构建目录来交叉编译内核模块并且它工作。
这次对于 OLinuXino,我没有构建源,所以我将 rootfs(使用 cp -dR)复制到我的 Ubuntu PC 并尝试通过将内核头目录指定为 /lib/modules/linux- 来交叉编译一个 hello world 内核模块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
scripts 文件夹中的 fixdep 二进制文件是为 ARM 预编译的,因此我删除了该二进制文件并为 x86 重新编译并将其放置在那里。当我再次尝试交叉编译内核模块时,抛出了一个类似的错误,抱怨脚本文件夹中的另一个可执行文件(这次是 modpost)。
我的问题是如何将 kernel-header / build 文件夹中的这些 arm 二进制文件替换为 x86 版本?构建文件夹中是否有脚本可以执行此操作?我可以用我的 ubuntu 内核模块构建文件夹中的脚本文件夹替换复制的 ArchLinux 中的脚本文件夹吗?或者我是否修改内核模块的 makefile 以指示构建脚本在脚本文件夹中重建二进制文件,或者为这个二进制文件使用不同的脚本文件夹(我会指定)内核头文件夹中 ubuntu 脚本文件夹的路径?或者我是否以错误的方式解决这个问题,并且有更好的方法来为我拥有的电路板和设置设置交叉编译?
PS。仅供参考:交叉编译器使用 libc 2.16,而用于 OLinuXino 的 ArchLinux img 上有 libc 2.17