我有一个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
答案 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-
。一旦遵循所有这些过程,您将成功编译目标的内核模块。