第 1 章 交叉编译简介

1.1 什么是交叉编译

对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?

在解释什么是交叉编译之前,先要明白什么是本地编译。

本地编译

本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

比如,我们在 X86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 X86 平台上的工具,开发针对 X86 平台本身的可执行程序,这个编译过程称为本地编译。

交叉编译

交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

比如,我们在 X86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 X86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

1.2 为什么会有交叉编译

之所以要有交叉编译,主要原因是:

  • Speed: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
  • Capability:整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
  • Availability:即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
  • Flexibility:一个完整的 Linxu 编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

1.3 为什么交叉编译比较困难

交叉编译的困难点在于两个方面:

不同的体系架构拥有不同的机器特性

  • Word size:是 64 位还是 32 位系统
  • Endianness:是大端还是小端系统
  • Alignment:是否必须按照 4 字节对齐方式进行访问
  • Default signedness:默认数据类型是有符号还是无符号
  • NOMMU:是否支持 MMU

交叉编译时的主机环境与目标环境不同

  • HOSTCC vs TARGETCC
  • Toolchain Leaks
  • Libraries
  • Testing

第 2 章 交叉编译链

2.1 什么是交叉编译链

明白了什么是交叉编译,那我们来看看什么是交叉编译链。

首先编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:

那么编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。

同时编译过程又是一个有先后顺序的流程,它必然牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,这就形成了一个链式结构。

因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉编译链。本文对这两个概念不加以区分,都是指编译链

2.2 交叉编译链的命名规则

我们使用交叉编译链时,常常会看到这样的名字:

arm-none-linux-gnueabi-gcc
arm-cortex_a8-linux-gnueabi-gcc
mips-malta-linux-gnu-gcc

其中,对应的前缀为:

arm-none-linux-gnueabi-
arm-cortex_a8-linux-gnueabi-
mips-malta-linux-gnu-

这些交叉编译链的命名规则似乎是通用的,有一定的规则:

arch-core-kernel-system
  • arch:用于哪个目标平台
  • core:使用的是哪个 CPU Core,如 Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是 none 或 cross 的。
  • kernel:所运行的 OS,见过的有 Linux,uclinux,bare(无 OS )。
  • system:交叉编译链所选择的库函数和目标映像的规范,如 gnu,gnueabi 等。其中 gnu 等价于 glibc + oabi; gnueabi 等价于 glibc + eabi。

注意:这个规则是一个猜测,并没有在哪份官方资料上看到过。而且有些编译链的命名确实没有按照这个规则,也不清楚这是不是历史原因造成的。

第 3 章 包含的工具

3.1 Binutils

Binutils 是 GNU 工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。
Binutils 工具包含的子程序如下:

  • ls:GNU 链接器 the GNU linnker
  • as:GNU 汇编器 the GNU assembler
  • addr2line:把地址转换成文件名和所在的行数
  • ar:A utility for creating,modifying and extracting from archives
  • c++filt:Filter to demangle encoded C++ symbols
  • dlltool:Creates files for building and using DLLs
  • gold:A new,faster, ELF only linker, still in beta test
  • gprof:Displays profiling information
  • nlmconv: Converts object code into an NLM
  • nm: Lists symbols from object files
  • objcopy: Copys and translates object files
  • objdump: Displays information from object files
  • ranlib: Generates an index to the contents of an archive
  • readelf: Displays information from any ELF format object file
  • size: Lists the section sizes of an object or archive file
  • strings: Lists printable strings from files
  • strip: Discards symbols

3.2 GCC

GNU编译器套件,支持 C,C++,Java,Ada,Fortran,Objective-C 等众多语言。

3.3 GLibc

Linux 上通常使用的 C 函数库为 glibc。 glibc 是 linux 系统中最底层的 api,几乎其他任何运行库都会依赖于 glibc。 glibc 除了封装 linux 操作系统所提供的系统服务外,它本身也提供了许多其他一些必要功能服务的实现。

3.4 GDB

GDB 用于调试程序

第 4 章 如何得到交叉编译链

既然明白了交叉编译链的功能,那么在针对嵌入式系统开发时,我们需要的交叉编译链从哪儿得到?

主要有三个方式可以获取

4.1 下载已经做好的交叉编译链

使用其他人针对某些 CPU 平台已经编译好的交叉编译链。我们只需要找到合适的,下载下来使用即可。

常见的交叉编译链下载地址:

  1. 在 http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载已经编译好的交叉编译链
  2. 在 http://www.denx.de/en/Software/WebHome 下载已经编译好的交叉编译链
  3. 在https://launchpad.net/gcc-arm-embedded下载已经编译好的交叉编译链
  4. 一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用。如crosstool-NG
  5. 如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。

厂家提供的工具一般是经过了严格的测试,并打入了一些必要的补丁,所以这种方式往往是最可靠的工具来源。

4.2 使用工具定制交叉编译链

使用现存的制作工具,以简化制作交叉编译链这个事情的复杂度。我们只需要了解有哪些工具可以实现,并选个合适的工具,搞懂它的操作步骤即可。

  1. crosstool-NG
  2. Buildroot
  3. Embedded Linux Development Kit (ELDK)

工具还有很多,各有各的优势和劣势,在这就不细说了。

4.3 从零开始构建交叉编译链

转载链接:原文链接

交叉编译详解 - 概念篇相关推荐

  1. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

  2. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm

    自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问题是一些比较基本的问题,由于时间的缘故,不会一一的为大家回复,如果有不明白的,希望大家勤自学!本系列虽然不难,但 ...

  3. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)

    IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...

  4. MSTP详解- 原理篇

    MSTP详解-原理篇 一. MSTP产生背景 二. MSTP基本概念 三.MSTP端口角色 四.MSTP的端口状态与收敛机制 五. MSTP 拓扑计算原理 5.1 MSTP 向量优先级 5.2 CIS ...

  5. STP和RSTP详解-原理篇

    STP和RSTP详解-原理篇 一.STP 1.1 STP基本概念 1.2 STP三个定时器 1.3 STP BPDU报文 1.3.1 配置 BPDU 1.3.2 TCN BPDU 1.3.3 BPDU ...

  6. iVX低代码平台系列详解 -- 概述篇(二)

    写在前面 ivx动手尝试电梯:ivx在线编辑器 iVX系列教程持续更新中 上篇文章可看:iVX低代码平台系列详解 – 概述篇(一) ivx目录 写在前面 一.iVX优势 1.快速学习 2.快速开发 3 ...

  7. Linux使用详解(进阶篇)

    文章目录 Linux使用详解(进阶篇) 1.Linux目录说明 2.操作防火墙 3.ulimit命令和history命令 4.RPM和Yum的使用 5.设置系统字符集 6.vi & vim编辑 ...

  8. Openharmony应用NAPI详解--基础篇

    NAPI是什么? 简单点理解就是在Openharmony里,实现上层js或ets应用与底层C/C++之间交互的框架. Openharmony里的官方解释:NAPI(Native API)组件是一套对外 ...

  9. Openharmony应用NAPI详解--进阶篇1

    NAPI面向C++的异步接口 3.C++实现NAPI异步接口需要做到三步 同步返回结果给js/ets调用者 另起线程完成异步操作 通过回调(callback)或Promise将异步操作结果返回 4.异 ...

最新文章

  1. ImageNet时代将终结?何恺明新作:Rethinking ImageNet Pre-training
  2. Fedora9建立交叉编译环境
  3. android选择下拉框的默认值,如何在Android中将默认值设置为微调器下拉列表?
  4. react native 的TextInput组件问题
  5. 第五次会议记录:开始进一步需求分析,及初步分工
  6. 【面试招聘】不要忽视实习面试失败对校招的影响
  7. reorder-list
  8. SecureCRT 设置护眼最佳方案 的字体及颜色
  9. 【C语言】第六章 集合数据与数组 题解
  10. visio网络拓扑图 下载_Visio2019软件下载及安装教程
  11. io字符流和字节流之间的转换和基本应用练习
  12. Ubuntu alias在/etc/profile重启无效解决
  13. python如何实现循环_如何构造python循环
  14. 【2017西安邀请赛:A】XOR(区间异或最大值多次查询---线段树+线性基合并)
  15. 微信开发者工具历史版本下载
  16. 2020.7.16.h5面试题
  17. 关于置信水平,求区间的简便算法
  18. 人工神经网络的基本原理及其应用
  19. 查询至少选了1班2号同学所选课的所有同学班号、学号
  20. linux 笔记实录(1)

热门文章

  1. 双屏显示器,扩展显示,笔记本清晰,扩展显示屏模糊的解决办法
  2. 数独小项目开篇:DFS解决数独难题
  3. 做企业数字化转型的最佳拍档,中软国际的变与不变
  4. 移动端网页特效以及常用开发框架
  5. 分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!
  6. 数据库基础之位图索引
  7. mapbox初步使用
  8. 批量安装当前文件夹下的exe文件
  9. 计算机游戏性能测评,游戏性能测试
  10. 夫妻财产公证有法律效力吗