交叉编译器

  • 11.1.交叉编译介绍
  • 11.2.Ubuntu交叉编译器
  • 11.3. 交叉编译流程
  • 11.4.交叉调试器--gdb



程序源码编译之后,最终要翻译成机器指令
ARM平台与X86平台,机器指令是不一样
怎么在高性能的X86平台上编译出在ARM平台上运行的程序?

  • ARM板上安装一个编译
  • 在PC上使用软件模拟一个ARM硬件平台
  • 交叉编译----在PC(X86)机上编译出ARM平台运行的程序。

11.1.交叉编译介绍

在 X86 架构 Linux 系统下进行 C 程序开发时, 我们使用系统的 gcc 编译器进行代码的编译, 编译生成的可执行程序直接在 X86 架构下的 PC 下运行的,这个过程叫做 本地编译 (Native Compile) 。 而如果该C程序想要编译出来后放到ARM处理器架构的系统上运行, 则需要在 X86 架构Linux系统下使用支持 ARM 的编译器编译, 这个编译器我们通常称为 交叉编译器 (Cross Compiler)。

而在一种平台上编译出能在另外一种体系结构完全不同处理器上运行程序的编译过程,叫做 交叉编译 (Cross Compile)。比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。

> 这里是引用

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc 或 newlib。

之所以几乎所有的ARM开发板开发都选择交叉编译,这是因为这些开发板生产出来后并没有系统,这时需要在PC上使用交叉编译器交叉编译操作系统源码,为它构建一个完整的 Linux 系统。另外,由于CPU处理能力、外存和内存存储空间的大小限制,它们不足以能够运行 gcc 编译环境,所以嵌入式开发绝大部分的过程都是交叉编译。

11.2.Ubuntu交叉编译器

Ubuntu之所以能成为嵌入式系统开发的首选Linux发行版本,正是因为它的软件包在线安装仓库中包含有海量的开发工具/软件,其中就包括嵌入式系统开发所需的交叉编译器、dtc等开发工具,这也就是为什么几乎所有主流的半导体厂商在发布SDK时都推荐使用Ubuntu系统。

在Ubuntu 系统中提供了如下四个版本的交叉编译器软件包:

  • gcc-arm-linux-gnueabi —- armel,ARM EABI Little-endian
  • gcc-arm-linux-gnueabihf —- armhf,ARM Hard Float
    gcc-arm-linux-gnueabi 与 gcc-arm-linux-gnueabihf区别涉及到 ARM 处理器架构中的浮点运算相关知识了。
  • gcc-arm-none-eabi —- bare metal, Linux下用于编译 ARM 架构的裸机系统,使用的是newlib这个嵌入式C库
  • gcc-aarch64-linux-gnu —- arm64,用于编译64位ARM处理器系统

出于低功耗、封装限制等种种原因,以前的一些ARM处理器没有独立的硬件浮点运算单元,需要使用软件来实现浮点运算。随着技术发展,现在高端的ARM处理器基本都具备了硬件执行浮点操作的能力。这样,新旧两种架构之间的差异,就产生了两个不同的嵌入式应用程序二进制接口(EABI)——软浮点(SoftFP)与矢量浮点(VFP)。但是软浮点(soft float)和硬浮点(hard float)之间有向前兼容却没有向后兼容的能力,也就是软浮点的二进制接口(EABI)仍然可以用于当前的高端ARM处理器。

11.3. 交叉编译流程

交叉编译器_linux_02

11.4.交叉调试器–gdb

调试器–Gdb调试流程首先使用gcc对test.c进行编译,注意一定要加上选项‘-g’

  • gcc -g test.c -o test
  • gdb test

gdb调试:

  1. 查看文件 (gdb) l
  2. 设置断点 (gdb) b 6
  3. 查看断点情况 (gdb) info b
  4. 运行代码 (gdb) r
  5. 查看变量值 (gdb) p n
  6. 单步运行 (gdb) n (gdb) s
  7. 恢复程序运行 (gdb) c
  8. 帮助 (gdb) help [command]

gdb注意事项:

  1. 在Gcc编译选项中一定要加入‘-g’。
  2. 只有在代码处于“运行”或“暂停”状态时才能查看变量值。
  3. 设置断点后程序在指定行之前停止
  4. 运行被调试程序,设置所有的能影响该程序的参数和变量。
  5. 保证被调试程序在指定的条件下停止运行。
  6. 当被调试程序停止时,让开发工程师检查发生了什么。
  7. 根据每次调试器的提示信息来做响应的改变,以便修正某个错误引起的问题