在 buildroot 中使用两个不同的工具链编译内核和用户空间

问题描述

使用运行 2.6.35 自定义内核的旧 ARM 板。制造商提供了两种不同的交叉工具链:

* gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) --> kernel toolchain
* gcc version 4.9.4 (crosstool-ng crosstool-ng-1.23.0) --> userspace toolchain

制造商还提供了一组脚本作为粘合剂来编译内核、模块并制作最终 rootfs 的包。

我的目的是删除所有自定义“粘合”脚本,并将整个构建过程集成到单个构建根中。我选择了 buildroot-2016.08.01。

运行 buildroot menuconfig 并设置此变量:

BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/arm/crosstool-ng/"
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="armv5te-linux-gnueabi"
BR2_TOOLCHAIN_EXTERNAL_PREFIX="armv5te-linux-gnueabi"

我可以设置外部用户空间工具链。用户空间编译工作正常,按预期生成最终的 rootfs。

这里我的问题是:是否可以在 buildroot 中定义两个外部工具链,一个用于编译内核,另一个用于编译 rootfs 用户空间?我不确定。我在 buildroot 文档中没有找到任何相关内容

我认为 buildroot 期望使用相同的工具链来编译内核和用户空间。但是我在尝试仅使用一个工具链来编译它们时遇到了问题。

a) 如果我尝试使用内核工具链编译用户空间,编译busyBox 会失败:

debianutils/lib.a(mktemp.o): In function `mktemp_main':
mktemp.c:(.text.mktemp_main+0x98): warning: the use of `mktemp' is dangerous,better use `mkstemp'
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x180): undefined reference to `setns'
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x78): undefined reference to `syncfs'
collect2: ld returned 1 exit status
Note: if build needs additional libraries,put them in CONfig_EXTRA_LDLIBS.
Example: CONfig_EXTRA_LDLIBS="pthread dl tirpc audit pam"
make[1]: *** [busyBox_unstripped] Error 1
make[1]: Leaving directory `/usr/local/buildroot/output/build/busyBox-1.25.0'

b) 如果我尝试使用用户空间工具链编译内核,则会出现意外错误

In file included from /linux-2.6.35-custom/arch/arm/include/asm/page.h:206:0,from include/linux/mmzone.h:20,from include/linux/gfp.h:4,from include/linux/kmod.h:22,from include/linux/module.h:13,from arch/arm/okl4-microvisor/vmmu.c:14:
arch/arm/okl4-microvisor/vmmu.c: In function 'reserve_node_zero':
arch/arm/okl4-microvisor/vmmu.c:488:35: error: taking address of expression of type 'void' [-Werror]
  reserve_bootmem_node(pgdat,__pa(&_stext),&_end - &_stext,^
/linux-2.6.35-custom/arch/arm/include/asm/memory.h:150:29: note: in deFinition of macro '__virt_to_phys'
 #define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
                         ^
arch/arm/okl4-microvisor/vmmu.c:488:30: note: in expansion of macro '__pa'
  reserve_bootmem_node(pgdat,^
arch/arm/okl4-microvisor/vmmu.c:488:45: error: taking address of expression of type 'void' [-Werror]
  reserve_bootmem_node(pgdat,^
arch/arm/okl4-microvisor/vmmu.c:488:53: error: taking address of expression of type 'void' [-Werror]
  reserve_bootmem_node(pgdat,^
arch/arm/okl4-microvisor/vmmu.c: In function 'setup_mm_for_reboot':
arch/arm/okl4-microvisor/vmmu.c:904:9: error: variable 'pgd' set but not used [-Werror=unused-but-set-variable]
  pgd_t *pgd;
         ^
cc1: all warnings being treated as errors
make[1]: *** [arch/arm/okl4-microvisor/vmmu.o] Error 1

然而,当使用适当的工具链编译用户空间和内核时,一切正常。我不明白为什么这个在用户空间运行良好的工具链在编译内核时会产生错误。这是正常的吗?提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)