Buildroot构建指南——工具链

2023-05-16

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的工具链了。

小结

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Buildroot构建指南——工具链 的相关文章

  • 冒泡排序,选择排序,插入排序的比较

    冒泡排序与选择排序相比 xff0c 一个从局部入手减少逆序元素 xff0c 一个放眼大局逐个选择最小值 xff0c 二者思路大不相同 但是 xff0c 它们又都有着 通过i次外层循环 xff0c 从数据中顺次求出i个最小值 的相同特征 相对
  • 【操作系统】2.3 进程同步与互斥

    这一节大概是操作系统中最难的一节了 2 3 1 进程的同步与互斥 2 3 1 进程的同步与互斥 StudyWinter的博客 CSDN博客 进程同步思维导图 进程同步 xff1a 在多道程序环境下 xff0c 进程是并发执行的 xff0c
  • 【算法】递增子序列

    总结一下三道求子序列长度的题 1 最长递增子序列 300 最长递增子序列 给你一个整数数组 nums xff0c 找到其中最长严格递增子序列的长度 子序列 是由数组派生而来的序列 xff0c 删除 xff08 或不删除 xff09 数组中的
  • 【算法】单调栈的题

    记一次笔试题 描述 给定一个长度为 nn 的可能含有重复值的数组 numsnums xff0c 找到每一个位置 ii 左边最近的位置 ll 和右边最近的位置 rr xff0c nums lnumsl 和 nums rnumsr 比 nums
  • Skip List--跳表(全网最详细的跳表文章没有之一)

    笔者目前是CPP方向 xff0c 今年 xff08 2023届 xff09 秋招时在简历中写的就是跳表的项目 xff0c 当时是啃源码啃下的 xff0c 把跳表整体的思路是理顺了 但是在面试过程中 xff0c 有不少面试官都对这个项目很感兴
  • 报错:Caused by: org.xml.sax.SAXParseException

    Caused by org xml sax SAXParseException 文档根元素 34 project 34 必须匹配 DOCTYPE 根 34 null 34 错误提示 xff1a gframework beans factor
  • 用malloc动态申请一个二维数组

    利用二级指针申请一个二维数组 define CRT SECURE NO WARNINGS include lt iostream gt include lt vector gt include lt algorithm gt using n
  • 有符号/无符号整数相加溢出的判断方法

    1 有符号数相加溢出判断 1 1 两个有符号的数是正数 当两个有符号整数x y同为正数 xff0c 且x 43 y的结果为非正时 xff0c 发生了正溢出 define CRT SECURE NO WARNINGS include lt i
  • 【算法】求最小子集的和被5整除

    昨天面试了一家公式 xff0c 面试上来问我 xff0c 使用过哪些STL容器 xff0c 我说了一下 xff0c 然后又问从最简单的开始说 面试官 xff1a 说说使用vector是需要注意什么 xff1f 我 xff1a 注意什么 迭代
  • TCP报文结构

    TCP报文结构 TCP报文由俩部分组成 xff1a TCP报头和TCP数据 TCP报文是TCP传输的数据单元 端口号 xff1a 用来标识一台主机的不同进程 1 xff09 源端端口号 xff1a 源端口和IP层解析出来的IP地址标识报文的
  • 【算法】洗牌算法

    碎碎念 xff1a 面试的时候 xff0c 让写这道题 xff0c 快写完了 xff0c 面试官告诉我 xff0c 这是洗牌算法 xff0c 1 介绍 洗牌算法是将原来的数组进行打散 xff0c 使原数组的某个数在打散后的数组中的每个位置上
  • 【操作系统】第一章总结

    1 1 操作系统介绍 1 1 1 操作系统的概念 功能和目标 1 1 1 操作系统的概念 功能和目标 xff08 系统资源的管理者 提供接口 作为扩充机器 虚拟机 xff09 StudyWinter的博客 CSDN博客 1 1 2 操作系统
  • 【操作系统】2.1 进程与线程总结

    2 1 1 操作系统之进程的定义 特征 组成 组织 2 1 1 操作系统之进程的定义 特征 组成 组织 StudyWinter的博客 CSDN博客 进程由程序段 数据段 进程控制块 xff08 PCB xff09 三部分组成 进程是进程实体
  • 【操作系统】2.2 操作系统的调度

    2 2 1 操作系统之处理机调度的概念及层次 2 2 1操作系统之处理机调度的概念及层次 StudyWinter的博客 CSDN博客 操作系统调度的层次 高级调度 xff08 作业调度 xff09 xff1a 外存 内存 中级调度 xff0
  • 【操作系统】2.4 死锁

    这一节也非常重要 2 4 1 死锁的概念 2 4 1 死锁的概念 StudyWinter的博客 CSDN博客 在并发环境下 xff0c 各种进程因竞争资源而造成的一种互相等待对方手里的资源 xff0c 导致各进程都阻塞 xff0c 都无法向
  • 3.1.1 什么是内存?进程的基本原理,深入指令理解其过程

    0 思维导图 1 什么是内存 xff1f 有何作用 xff1f xff08 1 xff09 存储单元 内存 Memory 是计算机的重要部件 xff0c 也称内存储器和主存储器 xff0c 它用于暂时存放CPU中的运算数据 xff0c 以及
  • 怎样用AT指令查询本机手机号码

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • 3.1.2 操作系统内存管理管些什么?

    0 思维导图 1 内存空间的分配与回收 2 内存空间的扩展 xff08 实现虚拟性 xff09 3 地址转换 4 内存保护 1 操作系统负责内存空间的分配和回收 xff1b 2 操作系统需要提供某种技术从逻辑上对内存空间进行扩充 xff1b
  • C++11特性

    最近打算照着源文档学习C 43 43 特性 xff0c 先从C 43 43 11的特性开始 学习 xff1a C 43 43 11 cppreference com C 43 43 11 C 43 43 11是继C 43 43 98之后的最
  • C++11特性之auto

    占位符类型说明 对变量而言 xff0c 指定要声明的变量的类型将从其初始值中自动推导出来 对于函数而言 xff0c 指定的返回类型将从其返回语句中推导出来 xff08 从C 43 43 14开始 xff09 对于非模版类型的参数而言 xff

随机推荐

  • C++11特性之decltype

    检查一个实体的声明类型或者检查表达式类型和值类别 语法 strong decltype strong entity strong strong 1 since C 43 43 11 strong decltype strong expres
  • 【算法】151. 反转字符串中的单词

    链接 xff1a https leetcode cn problems reverse words in a string 给你一个字符串 s xff0c 请你反转字符串中 单词 的顺序 单词 是由非空格字符组成的字符串 s 中使用至少一个
  • TensorFlow中numpy与tensor数据相互转化

    numpy与tensor数据相互转化 xff1a Numpy2Tensor 虽然TensorFlow网络在输入Numpy数据时会自动转换为Tensor来处理 xff0c 但是我们自己也可以去显式的转换 xff1a data tensor 6
  • ESP32环境搭建 HomeKit 平台搭建 苹果智能家居HomeKit

    本文所有操作环境在linux下 xff0c 参考README文档 xff0c 官方sdk获取连接 https github com espressif esp apple homekit adk HomeKit是Apple开发的框架 xff
  • 乐鑫代码中Ring Buffers (环形缓冲区)说明

    本文翻译自乐鑫文档 xff0c 详见链接地址 xff0c 结合用例自行测试 xff0c 欢迎交流 源码链接ringbuf c 项目中用乐鑫的wifi模组 xff0c esp8266 xff0c esp32中发现ringbuf的身影 xff0
  • Qt界面程序中嵌入其他可执行exe程序

    背景 xff1a 本文实验环境 windows10 xff0c qt5 14 由于工作需要写了一个小的qt程序 xff0c 然后在实际使用过程中还要和其他小工具来回切换 xff0c 就想能不能把其他工具代码集成 xff0c 最后发现对我来说
  • Windows10系统旧电脑打包迁移新电脑

    由于需要换了一台新电脑 xff0c 但是配置系统是个繁琐的大工程 xff0c 想想windows的环境变量啥的就头大 xff0c 就想偷懒把系统直接转移到新电脑 xff0c 网上搜索了一下是可行的 xff0c 好多ghost备份还原 xff
  • 线程池1.0和any类

    threadpool h ifndef THREAD POOL H define THREAD POOL H include lt iostream gt include lt memory gt include lt functional
  • esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)

    本文 ESP8266 和 ESP32 支持四种不同的 SPI flash 访问模式 xff1a DIO DOUT QIO 和 QOUT 这些可以通过 esptool py write flash 的 flash mode 选项设置 这些控制
  • IMX6ULL裸机启动,IMX6ULL运行freeRtos

    IMX6ULL裸机启动 xff0c IMX6ULL运行freeRtos 裸机启动部分 imx6ull中根据运行代码位置的不同RAM flash SD卡 xff0c 上电会先运行片上ROM中的代码 xff0c 搬运的数据大小是不同的 xff0
  • freeRtos中操作pxCurrentTCB部分汇编指令的理解

    关于freeRtos中操作pxCurrentTCB部分汇编指令的理解 asm void vPortSVCHandler void INDENT OFF PRESERVE8 ldr r3 61 pxCurrentTCB Restore the
  • 嵌入式开发中bin文件合并

    1 tr span class token string 39 000 39 span span class token string 39 377 39 span lt span class token operator span dev
  • 鲁班路由器AX1800折腾记录

    京东云鲁班畅享版64G Ram 512M flash 16M 型号 RF CP 02 ssh功能 当时看到帖子说R2010能直接进入ssh xff0c 果断关闭自动升级 xff0c 这一步就省略了 xff0c 参考如下 鲁班R2010 开通
  • Cannot convert a symbolic Tensor to a numpy array

    使用TF进行计算 xff0c 出现 xff1a Traceback most recent call last File 34 infer py 34 line 14 in lt module gt logits 61 classifier
  • ARM嵌入式系统为什么要做内存对齐

    做嵌入式系统软件开发 xff0c 经常在代码中看到各种各样的对齐 xff0c 很多时候我们都是知其然不知其所以然 xff0c 知道要做好各种对齐 xff0c 但是不明白为什么要对齐 xff0c 不对齐会有哪些后果 xff0c 这篇文章大概总
  • 第一篇博客,Hello World

    Hello World 这是我的CSDN第一篇博客 xff0c 掐指一算 xff0c 从学单片机开始 xff0c 学习开发嵌入式软件已经5年了 终于找到一个小窝能够和大家一起分享交流技术 今天是一个美好的开始 xff0c 你好 xff0c
  • Buildroot构建指南--Overview

    使用Buildroot 让嵌入式Linux系统构建更加便捷 本文以Buildroot 2016 05的版本为基础来讲解 xff0c 不同版本之间有细节差异 xff0c 需要根据读者使用的版本自行调整 Buildroot是什么 Buildro
  • Buildroot构建指南--快速上手与实用技巧

    Buildroot官方全英文使用手册的链接是https buildroot org downloads manual manual html xff0c 需要知道每一个细节的朋友 xff0c 可以仔细查阅 xff0c 这篇文章只是我自己从中
  • 构建Linux系统之实现Gnome桌面

    3 3 基于Ubuntu 实现Gnome 桌面 GNOME 是 GNU 网络对象模型环境 The GNU Network Object Model Environment 的简称 xff0c 目标是基于自由软件 xff0c 为Unix 或者
  • Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件 一般大家默认工具链等于gcc或者arm linux gcc xff0c 但是实际上 xff0c gcc只是工具链的编译器部分 xff0c 不是全部 xff0c 制