• IMX6ULL学习笔记(4)——安装并使用交叉编译工具链


    一、简介

    本地编译:编译器和目标程序都是相同架构的编译过程。
    交叉编译:编译器运行在x86架构平台上,编译生成ARM架构的可执行程序,这种编译器和目标程序运行在不同架构的编译过程。

    1.1 编译器类型

    • arm-linux-gnueabihf-gcc: 名称中的Linux表示目标应用程序是运行在Linux操作系统之上的,例如前面的hello.c程序。
      arm-none-eabi-gcc: 名称中的none表示无操作系统,目标应用程序的运行环境是不带操作系统的,例如裸机代码、uboot、内核代码本身。

    不过在开发中比较多的开发者对所有程序都直接用arm-linux-gnueabihf-gcc来编译,包括裸机代码和uboot,虽然可能因为代码本身没有调用到Linux相关的内容而不会出错,但这样做不够严谨,条件允许的话,我们还是严格区分开来。

    1.2 编译器命名格式

    以我们安装的 arm-linux-gnueabihf-gcc 编译器为例,表示它的目标芯片架构为ARM,目标操作系统为Linux,使用GNU的C标准库即glibc,使用嵌入式应用二进制接口(eabi),编译器的浮点模式为硬浮点hard-float。而另一种名为arm-linux-gnueabi- gcc的编译器与它的差别就在于是否带“hf”,不带“hf”表示它使用soft-float模式。

    编译器的命名没有严格的规则,但它们的名字中一般包含我们最关心的内容,可根据它们的名字选择要使用的编译器:
    arch [-os] [-(gnu)eabi(hf)] -gcc

    字段含义
    arch目标芯片架构
    os目标操作系统
    eabi应用二进制接口
    hf硬浮点模式

    1.2.1 目标芯片架构

    目标芯片架构就是指交叉编译器生成的程序运行的平台,如ARM、MIPS,其中ARM交叉编译器又分为ARMv7ARMv8aarch64架构。i.MX 6ULL的内核为Cortex-A7,它使用的是ARMv7架构。arm-linux-gnueabihf-gcc直接以arm表示ARMv7架构

    1.2.2 大小端

    指目标芯片的大小端模式,i.MX 6ULL使用的是小端模式。若是大端模式(big edian),编译器名字中会带“be”或“eb”字段进行标标注。

    1.2.3 目标操作系统

    目标操作系统表示编译后的程序运行的系统,主要有Linuxbare-metal(无操作系统)两种,arm-linux-gnueabi-gcc 表示它目标程序的运行环境为Linux系统,程序可以使用Linux下的C标准库或Linux内核提供的API,如fork等进程函数。而arm- eabi-gcc或arm-none-eabi-gcc表示它们的目标程序运行在无操作系统的环境中。

    1.2.4 C标准库类型

    C标准库类型通常有gnuuclibc等,分别表示GNU的glibc库和uclibc库,这取决于目标操作系统提供的C库类型,不过由于glibc和uclibc库是兼容的,所以开发者在编通常直接使用GNU类型的编译器而不管目标系统中的C库类型。 除了裸机编译器不带C库之外,其它编译器的C库类型都是glibc库的,如arm-linux-gnueabihf-gcc。

    1.2.5 应用二进制接口

    应用二进制接口(Application Binary Interface),描述了应用程序和操作系统之间或其他应用程序的低级接口。在编译器选项中主要有abieabi两种类型,abi通常用在x86架构上,而eabi表示embed abi,即嵌入式架构,如ARM、MIPS等。

    1.2.6 浮点模式

    部分ARM处理器带浮点运算单元,代码需要进行浮点运算时若交给fpu处理,可以加快运算速度。编译器针对浮点运算的不同处理情况提供了以下几种模式:

    • hard: 硬浮点类型(hard-float),采用fpu参与浮点运算。 arm-linux-gnueabihf-gcc、armeb-linux-gnueabihf-gcc都是硬浮点类型,即名字中带“hf”。
    • soft:软浮点类型(soft-float),即使有fpu浮点运算单元也不用,而是使用软件模式,arm-linux-gnueabi-gcc、armeb-linux-gnueabi-gcc都是软浮点类型,即名字中不带“hf”。
    • softfp:允许使用浮点指令,但保持与软浮点ABI的兼容性。

    i.MX6ULL带有fpu,对于soft-float和hard-float模式都支持,不过开发板中提供Linux文件系统中的库都是使用hard模式编译的,所以编写应用程序时也需要使用相同类型的编译器,否则会应用程序运行时会提示找不到库文件。

    二、安装交叉编译工具链

    安装交叉编译工具链有如下三种方式:

    • 直接在Ubuntu下使用APT包管理工具下载安装,操作简单。【版本可能过高,高于开发板镜像中glibc版本】
    • 自行下载第三方制作好的工具链,如Linaro,好处是选择丰富,能找到很多不同的版本。【推荐】
    • 下载官方Arm Developer的工具链。【版本可能过高,高于开发板镜像中glibc版本】

    2.1 使用APT安装交叉编译器

    通过APT包管理工具可直接执行以下命令安装:
    sudo apt install gcc-arm-linux-gnueabihf

    安装完成后使用如下命令查看版本:
    arm-linux-gnueabihf-gcc -v

    2.2 下载安装Linaro的交叉编译器

    Linaro 是一间由ARM发起,与其它ARM SOC公司共同投资的非盈利性质的开放源代码软件工程公司,Linaro 开发了很多软件,最著名的就是 Linaro GCC 编译工具链(编译器)。

    官网下载:
    【老版本,稳定版】https://releases.linaro.org/components/toolchain/binaries/
    【新版本,开发版】https://snapshots.linaro.org/gnu-toolchain/
    百度网盘:https://pan.baidu.com/s/1w7-PwMcCwXZpOhjfQYFxQg?pwd=2jh0 提取码:2jh0

    • 选择版本号

    • 选择ARM架构类型

    • 选择具体的编译器平台

    • 创建存放编译器的目录
      sudo mkdir /usr/local/arm

    • 将编译器复制到刚刚的目录
      sudo cp gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f

    • 将编译器工具进行解压
      sudo tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

    • 修改环境变量,使编译器永久生效
      使用 VI 打开/etc/profile 文件:
      sudo vi /etc/profile
      打开/etc/profile 以后,在最后面输入如下所示内容:
      export PATH=$PATH:/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

    • 修改好以后就保存退出,重启系统,交叉编译工具链(编译器)就安装成功了
      sudo reboot

    • 安装完成后使用如下命令查看版本
      arm-linux-gnueabihf-gcc -v

    • 如果是Linaro 4.9的老版本编译器,还需要安装额外的库
      sudo apt-get install lsb-core lib32stdc++6

    2.3 下载安装Arm Developer的交叉编译器

    东西都是一样的,区别在于:Linaro发布的版本属于开发者构建的版本,可以尝试的最新出炉的编译器,但不一定稳定,Linaro完成一个版本的开发后交给Arm,Arm发布稳定版本,但版本稍微落后而已。

    官网下载:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
    百度网盘:https://pan.baidu.com/s/1n_UqJ2XfSHpewGcokdrlAw?pwd=7loi 提取码:7loi

    • 选择主机操作系统
      x86_64 Linux 托管的交叉工具链

    • 选择ARM架构类型和具体的编译器平台

    • 创建存放编译器的目录
      sudo mkdir /usr/local/arm

    • 将编译器复制到刚刚的目录
      sudo cp arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz /usr/local/arm/ -f

    • 将编译器工具进行解压
      sudo tar -vxf arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz

    • 修改环境变量,使编译器永久生效
      使用 VI 打开/etc/profile 文件:
      sudo vi /etc/profile
      打开/etc/profile 以后,在最后面输入如下所示内容:
      export PATH=$PATH:/usr/local/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz/bin

    • 修改好以后就保存退出,重启系统,交叉编译工具链(编译器)就安装成功了
      sudo reboot

    • 安装完成后使用如下命令查看版本
      arm-linux-gnueabihf-gcc –v

    三、使用交叉编译工具链

    • 编写一个hello.c文件
      vi hello.c

    • 输入代码

    #include 
    
    int main()
    {
    	printf("hello world\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    • 由 Leung 写于 2022 年 9 月 2 日

    • 参考:4. ARM-GCC和开发板的HelloWorld
        i.MX6ULL快速上手 | 01 - i.MX6ULL Alpha开发板快速上手

  • 相关阅读:
    ORA-00600 【3948】,ORA-00600 【3949】
    MacBook Pro完整卸载及安装激活VMware Fusion13.0.0教程
    微信小程序生成海报
    2022 年全球十大最佳自动化测试工具
    NVMe协议详解(一)
    04.在谷歌浏览器中安装模拟浏览器ChromeDriver的详细步骤
    学长教你学C-day9-C语言循环结构与选择结构
    个人信贷违约预测代码实战
    云原生之深入解析Kubernetes集群内的服务通信机制
    运行 Python 脚本/代码的几种方式
  • 原文地址:https://blog.csdn.net/qq_36347513/article/details/126658866