3

我有一个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

4

2 回答 2

1

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

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

设置QEMU_LD_PREFIX为您的 ARM 库文件所在的位置,确保 qemu-arm .../modpost 实际工作。然后make按照您尝试的方式运行。

如果你会读中文,你可以在这里阅读我的经验

于 2015-09-13T10:46:24.203 回答
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

必须安装交叉编译器并导出 ie 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-. 完成所有这些过程后,您将成功为目标编译内核模块。

于 2013-04-24T09:40:33.500 回答