Ubuntu20.04_交叉编译工具链

交叉编译工具链

  • 1. 交叉编译是什么?
  • 2. 交叉编译特点
  • 3. 提供交叉编译工具链的公司
    • 3.1. Linaro
  • 4. ubuntu安装交叉编译工具链
    • 4.1. “交叉编译工具链”拷贝到ubuntu工作目录,并解
    • 4.2. 将其中的/bin加入到环境变量
    • 4.3. 加载环境变量
  • 5. 宿主机编译流程
  • 6. 交叉编译工具有哪些?
  • 7. arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc 区别

1. 交叉编译是什么?

Ubuntu20.04_交叉编译工具链_第1张图片

本地编译:x86机器编译出x86上的代码,在x86机器上运行。

交叉编译:x86机器编译出arm上的代码,在arm机器上运行。

Ubuntu20.04_交叉编译工具链_第2张图片
为何要交叉编译呢?
答:

  • 嵌入式开发的CPU比较简单,本身无法搭载开发环境,有些甚至操作系统都没有。比如:Android软件,需要在x86架构电脑上编译,再下载到Android手机中运行,通常情况下,手机自己不能编译Android软件。
  • 交叉编译可以使用高性能机器为低性能机器开发软件(包括开发裸机软件、系统级和应用级软件)

2. 交叉编译特点

  • 必须使用专用的交叉编译工具
  • 由于可执行程序不能本地运行调试,因此必须配合一定的手段(专用调试器、JTAG调试器、USB下载、串口下载、SD启动、网络共享等手段)将可执行程序下载到目标嵌入式设备上运行调试。

3. 提供交叉编译工具链的公司

3.1. Linaro

gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar

4. ubuntu安装交叉编译工具链

4.1. “交叉编译工具链”拷贝到ubuntu工作目录,并解

存档路径:

mkdir -p ~/workspace/linux/tools/

安装路径:

sudo mkdir -p /usr/local/arm/

4.2. 将其中的/bin加入到环境变量

# 环境变量路径
vim /etc/profile

添加Path:

export PATH=$PATH:/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

4.3. 加载环境变量

source /etc/profile

或者,重启。如果不重启,每次打开一个终端窗口,需要source一次/etc/profile

5. 宿主机编译流程

Ubuntu20.04_交叉编译工具链_第3张图片

6. 交叉编译工具有哪些?

arm-linux-gcc——交叉编译器

arm-linux-addr2line

arm-linux-objcopy——文件格式转换器
用法:arm-linux-objcopy -O binary led.elf led.bin
作用:把led.elf格式的文件转换成led.bin二进制文件。

arm-linux-readelf——交叉elf文件工具

arm-linux-ar——库管理器

arm-linux-ld——交叉链接器

arm-linux-objdump——交叉反汇编器
用法:arm-linux -objdump -D -S hello >dump
作用:把hello可执行文件反汇编后输入保存到dump文件中。
说明:-D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中

arm-linux-size

arm-linux-nm

arm-linux-strip

arm-linux-cc

arm-linux-gprof

arm-linux-c++filt

arm-linux-as

arm-linux-cpp

arm-linux-gccbug

arm-linux-ldd

arm-linux-populate

arm-linux-strings

arm-linux-c++

arm-linux-g++

arm-linux-gcov

arm-linux-ranlib

7. arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc 区别

  • EABI:embedded application binary interface,嵌入式应用二进制接口。支持软件浮点硬件浮点功能混用,系统调用的效率更高,和今后的工具更兼容,软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。

  • gnueabi和gnueabihf的区别:在于armelarmhf 两个不同的架构,armel和armhf这两种架构在对待浮点运算采取了不同的策略。其实就是 gcc 的选项 -mfloat-abi 的默认值不同:
    (参数1) soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
    (参数2) softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
    (参数3) hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

你可能感兴趣的:(Ubuntu20.04_交叉编译工具链)