Buildroot构建指南——工具链

Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件。一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工具链的原材料,除了gcc,还需要linux内核,libc库等一系列的软件包。所谓万事开头难,如何在Buildroot中使用自己的交叉编译工具链则是第一道难关。

Buildroot支持从零开始用原材料软件包自动构造工具链,也支持直接使用第三方制作好的工具链。

toolchain-buildroot 从零开始自动制作工具链
在make menuconfig –> Toolchain –>Toolchain type中,有2个选项,选择buildroot toolchain则是使用buildroot默认的自动化脚本从零开始制作交叉编译工具链,如果是选择externaltoolchain 则是使用外部制作好的工具链。

Figure 1  toolchain type 选项

在mini2440_defconfig的配置文件中,我们可以看到,它并没有toochain相关的选项,只是在cpu指令集部分选择了ARM920T  ,这种情况它会采用buildroot-toolchain也就是buildroot默认的自动化脚本,从零开始制作工具链。实际上,你只要make toolchain然后等待几分钟,Buildroot就会将制作好的全新工具链放到output/host/目录下了。

Figure 2 mini2440_defconfig配置部分截图

      整个工具链自动化制作过程可以参考toolchain/ 目录下的toolchain-buildroot/ 、toolchain.mk、helpers.mk、toolchain-wrapper.mk等几个脚本,我就不详细说了。但是有几个关键点我还是强在下面列一下。总之制作过程还是很复杂的,所以如果是初学者,用手工方法从零开始做交叉编译工具链,将是多大的挑战。

a).  从图3中我们可以看到制作交叉工具链大概需要的原材料软件包

Figure3 制作交叉工具链的原材料

工具链主要的原材料包括:gcc,、libc库,、linux内核头文件、binutils以及一系列自动构建打包工具如m4、gmp、mpc等。

另外要强调的是,从工具链的原材料可以知道为什么Linux内核、驱动以及应用软件要用同一个工具链编译,为什么内核版本要适配它的工具链。这是因为工具链本身的制作依赖于特定版本的Linux内核和libc库。

b). 从图1的makemenuconfig –> Toolchain这一系列选项可以看到,制作工具链还可以选择libc库(uclibc还是glibc,自己添加Android特有的Bionic libc),不同的libc性能,size,效率,稳定性以及GPL协议支持上有着一定的差异,需要使用者谨慎选择和测试。mini2440直接采用buildroot提供的默认的uclibc,不保证其稳定性和bug。

另外,toolchain后面还有Linux内核版本以及MMUsupport以及gcc版本的选择,可见如果需要定制特定的Linux内核(比如不带MMU的实时版),除了移植内核之外,还需要特别为其定制工具链。

c). make menuconfig –> Target option 中的选项也是与交叉工具链密切相关的。

其中芯片的CPU的大小端,是否编译成elf格式,指令集,ABI的类型(EABI是Embeded ABI的意思,EABIHF是采用硬浮点的ABI),以及软硬浮点特性(软浮点不会有编译兼容性问题,但是在支持硬浮点的高级嵌入式芯片,采用软浮点配置,很多性能会发挥不佳,但是ARM9这种低端平台用软浮点应该OK)等等选项,都是应该考虑的点。

 

Figure4 与交叉工具链相关的target option选项

toolchain-external 使用第三方现成工具链
这节用友善的Tiny4412开发板官方提供的工具链为例,介绍如何将外部第三方工具链移植到到Buildroot的编译环境。Tiny4412开发板用的SOC芯片的基于ARM-Cortex-A9内核的三星Exyons-4412 真四核SOC芯片,曾经是三星旗舰手机Galaxy-S3的主打SOC。

从友善官方提供的交叉编译工具链的包命名来看,工具链使用的gcc版本是4.5.1,有vfp则说明工具链支持应付点编译。V6应该是指令集是ARMV6,但是ARM-V6实际上是ARM11的指令集,Cortex-A9的应该是ArmV7才对, 这里应该是命名出错了,算是一个小漏洞吧。

Figure5  友善官方提供的tiny4412交叉编译工具链

移植步骤如下:

1.      为了不产生命名误导,我们将工具链的压缩包中4.5.1/* 目录下的所以内容拷贝出来,放到一个叫toolchain-tiny4412重新压缩成名字为arm-linux-gcc-4.5.1-tiny4412.tar.bz2的压缩包,将其cp到/mnt/sdb/3rd-pkg目录下,细心的朋友已经发现,根据前面一篇Buildroot快速入门的内容,这个文件夹是我保存第三方软件包的专门文件夹,待会Buildroot会用file的方法从该文件夹中把工具链cp到buildroot/dl/目录下的。

Figure6 保存在/mnt/sdb/3rd-pkg 目录下的工具链压缩包

2.      在make menuconfig –> Toolchain –>Toolchain type中选中external toolchain,下面的Toolchain栏中的arm-linux-gcc-4.5.1for tiny4412选项,实际上原本是没有的,是我自己加上去的。
 

Figure7 Toolchain的选择

3.      那么如何把自己的工具链加上去呢?cd buildroot/toolchain/toolchain-external/文件夹,根据前一篇文章快速上手的经验,要加自己的工具链,肯定是该配置,再改mk文件啦!

在该目录的Config.in文件的108行,有一个现成的第三方ARM cortex-A9 第三方交叉工具链的配置代码。
 

Figure8  buildroot/toolchain/toolchain-external/Config.in中的ARM Cortex-A9现成参考配置

我们可以参考模仿这段代码,稍微修改,在这段代码后面加入我们自己的配置代码:

注意,命名很重要,变量名一定是BR2_TOOLCHAIN_EXTERNAL_开头,后面加上自己的工具链名。
 

Figure9 Config.in中参考修改的tiny4412工具链配置代码

在我的修改中,出来提示字符串和help部分的相关注释和提示文字,主要是把主机gcc版本的最低要求降低到4.5,再去掉了内核头文件最低版本限制(这里其实是友善官方的疏忽,友善在制作工具链的时候,采用的Linux内核头文件版本很低,和编译的内核版本不匹配,导致头文件版本检查会报错,因而我去掉了最低版本的限制,这也是潜在漏洞之一吧)。

4.  配置交叉工具链前缀名。在Config.in的690行左右,为刚才添加的BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM选择工具链前缀名。

前缀名的格式组成是这样的:目标cpu-厂商-操作系统-库和abi格式,我们参考之前模仿的配置,选择arm-nonelinux-gnueabi,实际上,友善官方给的工具链就是以arm-nonelinux-gnueabi作为前缀命名的。

 Figure10  工具链前缀名配置

Figure11 tiny4412官方的工具链命名

5.      修改toolchain-external.mk 文件,加入自己配置。在296行,仿照前面一个工具链的变量配置,为BR2_TOOLCHAIN_EXTERNAL_TINY4412_ARM的配置增加下载地址和压缩包的名字,压缩包名字在第一步已经做好。至于下载地址,直接抄过来就行了,友善提供的定制化工具链,网上下载不到的。

Figure12 为toolchain-external.mk 加入tiny4412工具链的配置

事实上,打开那个地址,我们可以看到由sourcery官方维护的很多现成制作好的工具链,所以嘛直接拿来用就好了,自己从零制作工具链多麻烦啊!当然这些工具链的稳定性还是需要自己测试一番。

Figure13 sourcery网上可下载的现成工具链

6.      在menuconfig中设置下载的镜像地址。这个和前一篇文章一样,将本地保存工具链的地址,按照格式,设置为file的镜像地址。实际上,Buildroot的下载脚本,默认的规定是优先去本地的file镜像地址找软件包,找不到之后,才会走git或者网站下载等其它方法。当然网上肯定是下载不到的,但是先从本地找到就OK,这也是第一步为什么要保存工具链压缩包到该地址的原因。

关于Buildroot下载软件包的顺序,可以参考package/pkg-download.mk的脚本,在214行可以看到,只有在本地file路径找不到了,才会采用配置的(PKG)_SITE_METHOD方法去获取软件包。

 Figure14  工具链的下载镜像地址

Figure15 Buildroot自动下载脚本的下载过程

7.      menuconfig中的几项配置。修改完配置脚本和编译构建mk脚本后,还得在menuconfig中把修改的东西配置进去。

在target Option的配置中,注意上一节提到的几点。但是这里有几个新的选项需要注意

a). CPU架构选择的是Cortex-A9

b) vfp友善官方给的工具链是支持的,所以这里可以打开,这样就能支持硬浮点了

c) NEON SIMD是CPU支持的高性能多媒体引擎的功能,这是4412这种级别的多媒体处理器的杀手级功能,但是我们现在并不了解它的特性,也不知道友善的工具链在制作的有没有把该功能加上去,因而暂时不打开。但是专业的工程师要去了解这项功能,以便发挥SOC和CPU的潜能。

d). VFP硬浮点的版本,这一项由于友善的资料不明确,暂时选VFPv3-D16版本,根据说明,Coretex-A9对这个版本都会支持的。

e). ABI的问题,根据图11的内容,友善的工具链应该只是用了EABI来做的,没有用EABIhf。这几项是什么意思呢?浮点选项其实有软浮点、硬浮点EABI(softfp)和硬浮点EABIhf三个。

软浮点就是用软件模拟浮点运算

硬浮点EABI就是用浮点指令,但是为了兼容旧版本的软浮点编译出来的库还是用整数寄存器传递浮点数,这样牺牲了一些效率,但是在工具链中存在旧的软浮点库时,是可以兼容并不会出现编译错误的。

硬浮点EABIhf则是使用纯粹的硬浮点指令和浮点寄存器来计算浮点数,这样效率会更高,但是不再兼容工具链中旧版的软浮点下编译出来的库,如果不重新制作硬浮点EABIhf的工具链,可能会出现编译问题。

EABIhf需要知道整个工具链的库的兼容特性,目前看起来友善官方工具链不支持这个选项,其工具链命名也是EABI,但是有支持vfp,因而我们选择硬浮点EABI的配置。具体要如何支持EABIhf,可以搜其它相关文章,这个可能需要重新制作整个工具链。

以上这些选项实际上都是编译toolchain-wrapper传递的,toolchain-wrapper是一个中间层,负责编译时,传递某些特定选项给工具链,以上这些选项确定后,都会被toolchain-wrapper以参数的时候在编译时传递给交叉工具链的。

Figure 16 menuconfig -->target option的配置

Figure 17 menuconfig -->toolchain的配置

在加入了tiny4412的配置后,最后在toolchani中选择自己的工具链,选上MMU功能,然后用pipe选项进行编译加速。

最后,make toolchain  ,你就可以看到Buildroot系统如何构建出tiny4412的工具链了。

小结
整体而言,从零制作一个工具链,对嵌入式的知识掌握还是需要深入的掌握,另外,工具链对整个系统代码的稳定性有着极大的影响,所以直接用自动制作的工具链,一定要经过严格的压力测试,否则容易出现各种隐患。

因而,采用第三方制作好的,有专门公司维护的工具链,应该是一个更为有效的开发方式。

原文链接:https://blog.csdn.net/zhou_chenz/article/details/52346134

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 荔枝派(Lichee Pi)是一款基于Allwinner系列芯片的开发板,而nano buildroot是一款开源的工具工具是一系列用于构建、编译和调试软件的工具的集合。而nano buildroot则是在buildroot基础上移植和优化的版本。 荔枝派的nano buildroot工具提供了完整的开发环境,可以方便地进行软件的开发和调试。它支持包括C、C++、Shell脚本等多种编程语言,并且提供了一些常用的软件包和工具,如GCC编译器、调试工具、网络协议栈等。 使用nano buildroot工具可以方便地构建自己的应用程序,开发各种基于荔枝派的嵌入式系统。它可以帮助开发者搭建符合自己需求的嵌入式开发环境,并提供了各种工具和库,简化了软件开发的过程。 此外,nano buildroot还提供了一些官方维护的软件包,可以方便地选择和集成到自己的系统中。通过配置文件,开发者可以自定义系统的各种特性,如文件系统类型、网络协议栈等。同时,nano buildroot还支持远程调试功能,可以方便地进行程序的调试和优化。 总结来说,荔枝派的nano buildroot工具提供了一个方便、高效的开发环境,适用于各种嵌入式开发项目。它可以帮助开发者快速构建自己的嵌入式系统,并提供强大的调试和优化能力。无论是初学者还是有经验的开发者,都可以通过使用nano buildroot轻松进行嵌入式开发。 ### 回答2: 荔枝派(LicheePi)是一款开源的单板电脑,而nano buildroot是一个适用于荔枝派的工具。 nano buildroot工具是专门为荔枝派定制的,它提供了一种简化的方式来构建荔枝派的嵌入式操作系统。通过使用这个工具,开发者可以轻松地配置和构建他们想要的系统,以满足特定的需求。 该工具的主要优势之一是其灵活性。它允许开发者选择要包含在系统中的软件包,以及配置系统的各种设置。这使得开发者能够根据项目的需求定制一个最小、精简的系统,从而减少资源的占用,并提高系统的性能。 此外,nano buildroot工具还提供了一套完整的开发环境,包括交叉编译器、调试工具和库等。它使开发者能够在本地开发环境中编写、编译和调试他们的代码,然后将最终的可执行文件或完整的系统映像传输到荔枝派平台上运行。 总的来说,荔枝派nano buildroot工具为开发者提供了一种方便、灵活和高效的方式来构建和定制荔枝派的嵌入式系统。它使得开发者能够更好地利用荔枝派的硬件资源,并快速实现他们的创意和解决方案。 ### 回答3: 荔枝派 Nano是一款基于ARM架构的开发板,它运行了Linux操作系统。而Buildroot是一个能够为嵌入式系统生成精简的Linux根文件系统的工具。 荔枝派Nano可以通过Buildroot工具进行构建,以定制化地配置和构建Linux根文件系统。Buildroot工具包括一系列的脚本和配置文件,用来从源代码编译各种软件包,生成适用于荔枝派Nano的根文件系统。 通过Buildroot工具,我们可以选择需要的软件包和功能来构建根文件系统,从而满足我们的特定需求。例如,我们可以选择安装必要的组件,如系统工具、网络协议栈、文件系统和驱动程序,以及其他软件包,如开发工具、编译器和调试工具Buildroot工具的另一个优点是其具有良好的可定制性。我们可以根据自己的需要进行定制,添加或删除想要的软件包,并进行不同选项的配置。这样,我们可以根据具体项目的要求,定制一个定制化的根文件系统,使荔枝派Nano满足我们的需求。 然而,需要注意的是,使用Buildroot工具进行构建需要一定的Linux系统和软件开发经验。用户需要了解Linux系统和软件包的架构和依赖关系,以及如何正确配置和编译它们。同时,构建出的根文件系统还需要经过测试和验证,以确保其稳定性和兼容性。 总而言之,荔枝派Nano和Buildroot工具是一对强大的组合,可以为我们提供一个定制化的Linux根文件系统。通过合理配置和构建,我们可以充分利用荔枝派Nano的性能和功能,满足各种嵌入式系统开发的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值