0

我有一个由硬件供应商根据版本2.6.18修改的自定义Linux内核。我需要使用最新版本的 uClibc 为MIPS架构生成一个新的工具链。

我选择了crosstool-ng工具来简化这个过程,但它在生成过程中失败了。这是错误部分的日志:

[INFO ]  =================================================================
[INFO ]  Installing kernel headers
[DEBUG]    Using kernel's headers_install
[EXTRA]    Installing kernel headers
[DEBUG]    ==> Executing: 'make' '-C' '/home/myuser/sources/custom-linux/toolchain/.build/src/linux-custom' 'O=/home/myuser/sources/custom-linux/toolchain/.build/mipsel-unknown-linux-uclibc/build/build-kernel-headers' 'ARCH=mips' 'INSTALL_HDR_PATH=/home/myuser/x-tools/mipsel-unknown-linux-uclibc/mipsel-unknown-linux-uclibc/sysroot/usr' 'V=0' 'headers_install' 
[ALL  ]    make[1]: Entering directory `/home/myuser/sources/custom-linux/stblinux-2.6.18'
[ALL  ]      CHK     include/linux/version.h
[ALL  ]      UPD     include/linux/version.h
[ALL  ]    *** Error: Headers not exportable for this architecture (mips)
[ERROR]    make[2]: *** [headers_install] Error 1
[ERROR]    make[1]: *** [headers_install] Error 2
[ALL  ]    make[1]: Leaving directory `/home/myuser/sources/custom-linux/stblinux-2.6.18'
[ERROR]  
[ERROR]  >>
[ERROR]  >>  Build failed in step 'Installing kernel headers'
[ERROR]  >>        called in step '(top-level)'
[ERROR]  >>
[ERROR]  >>  Error happened in: CT_DoExecLog[scripts/functions@257]
[ERROR]  >>        called from: do_kernel_install[scripts/build/kernel/linux.sh@112]
[ERROR]  >>        called from: do_kernel_headers[scripts/build/kernel/linux.sh@91]
[ERROR]  >>        called from: main[scripts/crosstool-NG.sh@632]
[ERROR]  >>
[ERROR]  >>  For more info on this error, look at the file: 'build.log'
[ERROR]  >>  There is a list of known issues, some with workarounds, in:
[ERROR]  >>      '/home/myuser/.local/share/doc/crosstool-ng/ct-ng.hg+default-20f2459b97bf/B - Known issues.txt'
[ERROR]  
[ERROR]  (elapsed: 41:41.63)

该问题似乎与 *headers_install* 规则有关。我认为它是在特定版本的内核中引入的。有趣的事实是,如果我跑

make ARCH=mips INSTALL_HDR_PATH=... headers_install

标头将安装得很好。该问题似乎与使用O=参数有关。有谁知道它是干什么用的?这个问题有解决方法吗?

4

2 回答 2

0

构建一个交叉编译器/binutils 通常非常困难,而且它不允许您测试您的程序。
虚拟机速度非常慢,并且会产生很强的分离性,这使得主机和虚拟机之间难以共享文件。

最简单的解决方案是Qemu-User-static:系统调用和指令以用户模式包装到本机内核。

下载或解压rootfs。
将其复制到您的真实根目录的子文件夹中。
将 qemu-user- (你的 mips 架构的名称) -static 复制到目标目录的根目录。
通过执行 /bin/bash 将 /etc/resolv.conf 复制到 /your_path_to_target/etc/resolv.conf Chroot 到它。
使用 rootfs,就好像您使用的是基于 mips 的真实文件一样。机器。

事情变得非常简单:由于硬编码路径之类的原因,许多库没有被编译(你会遇到很多;很多问题,比如你在交叉编译时遇到的问题)。就像您在本地构建包一样,这一切都发生了。

于 2014-05-01T21:39:34.003 回答
0

问题是这个 Linux 内核版本中不存在headers_install规则。它包含在2.6.19.1中:

现代 Linux 内核(基于 2.6.19.1 和更新版本)通过“make headers_install”命令导出内核头文件。

https://www.kernel.org/doc/index-old.html#3.2.2.3.1

由于buildroot期望这个规则存在,我猜想如果没有自定义补丁它就行不通。

于 2014-05-02T23:18:23.030 回答