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

使用来自目标ARM板rootfs的内核头交叉编译内核模块,arm,embedded-linux,kernel-module,archlinux,Arm,Embedded Linux,Kernel Module,Archlinux,我有一个OLinuXino板。我下载了ArchLinuxIMG文件(ArchLinuxARM-2013.02-olinuxino-rootfs.img),并使用dd将其写入SD卡,然后使用该卡启动主板。我使用以太网将电路板连接到互联网,安装了gcc,并使用pacman在其上制作。我能够在板上为板构建用户空间程序 ArchLinux SD卡映像在rootfs(/lib/modules/linux-3.7.2-2-ARCH/build)中已经有内核头目录。因此,我也能够在主板上为主板构建可加载的内核

我有一个OLinuXino板。我下载了ArchLinuxIMG文件(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的Sourcery 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/linux-3.7.2-2-ARCH/build来交叉编译hello world内核模块,它抛出了以下错误:

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重新编译,然后将其放在那里。当我再次尝试交叉编译内核模块时,抛出了一个类似的错误,抱怨scripts文件夹中有另一个可执行文件(这次是modpost)

我的问题是如何用x86版本替换内核头/构建文件夹中的这些arm二进制文件?“生成”文件夹中是否有执行此操作的脚本?我可以用ubuntu内核模块构建文件夹中的脚本文件夹替换复制的ArchLinux中的脚本文件夹吗?或者我修改内核模块的makefile来指示构建脚本在scripts文件夹中重建二进制文件,或者为这个二进制文件使用不同的scripts文件夹(我会指定)内核头文件夹中ubuntu脚本文件夹的路径? 或者我是不是走错了路,有没有更好的方法来设置交叉编译的董事会和我的设置


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

如果您是为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

必须安装交叉编译器并导出,即导出路径=$PATH:。在使用make实用程序进行编译时,提供
make ARCH=arm(您正在编译的目标)CROSS\u COMPILE=arm none linux gnueabi-
。一旦遵循所有这些过程,您将成功地为目标编译内核模块

我已经成功编译了一个没有内核源代码的模块,只使用了内核头。我使用了来自gcc libs和glibc的qemu和ARM版本库文件

只需复制主机的scripts目录即可覆盖ARM-one,除了
mod/modpost
程序。编辑
mod/Makefile.modpost
以使用
qemu-arm
运行
modpost
程序。如果您不想实际更改这些文件,当然可以使用aufs/overlayfs/bind mount来实现同样的效果

QEMU\u LD\u前缀设置为ARM库文件所在的位置,确保QEMU ARM…/modpost实际工作。然后按照您尝试的方式运行
make


如果你能读中文,你就可以读。

保存
.config
,在复制的目录上使用
makedistclean
,然后在PC上交叉构建内核。之后,所有二进制文件都应该正确设置。我成功地使用主机的
脚本(通过mount--bind)来编译源代码,但是我在
modpost
之后遇到了一个奇怪的错误:
FATAL:section header offset=11258999068426292在文件'/ldata/DATA/src/rtl8192eu linux driver/8192eu.o'中大于filesize=1100031
我最终通过使用qemu arm运行modpost使其工作:-)