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

这篇具有很好参考价值的文章主要介绍了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

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

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

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

  • 选择ARM架构类型
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

  • 选择具体的编译器平台
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

  • 创建存放编译器的目录
    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
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

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

  • 安装完成后使用如下命令查看版本
    arm-linux-gnueabihf-gcc -v
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

  • 如果是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架构类型和具体的编译器平台
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

  • 创建存放编译器的目录
    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
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

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

  • 安装完成后使用如下命令查看版本
    arm-linux-gnueabihf-gcc –v
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链

三、使用交叉编译工具链

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

  • 输入代码

#include <stdio.h>

int main()
{
	printf("hello world\n");
	return 0;
}
  • 执行编译
    arm-linux-gnueabihf-gcc hello.c -o hello

  • 将生成的hello文件通过NFS放到开发板上运行
    查看 IMX6ULL学习笔记(3)——挂载NFS网络文件系统
    IMX6ULL学习笔记(4)——安装并使用交叉编译工具链


• 由 Leung 写于 2022 年 9 月 2 日

• 参考:4. ARM-GCC和开发板的HelloWorld
    i.MX6ULL快速上手 | 01 - i.MX6ULL Alpha开发板快速上手文章来源地址https://www.toymoban.com/news/detail-441877.html

到了这里,关于IMX6ULL学习笔记(4)——安装并使用交叉编译工具链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(62)
  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(39)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(37)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(36)
  • IMX6ULL 自学笔记(Makefile 以及 系统移植)

    1、语法 目标…… : 依赖文件集合…… 命令 1 命令 2 …… 例子: 生成main可执行文件需要main.o input.o calcu.o,命令是gcc -o main main.o input.o calcu.o 2、变量 Makefile中的变量只能是字符串 例 :将object赋值 main.o input.o calcu.o,变量引用的时候要加$() 3、几种赋值运算符 “=” :不一定要

    2024年02月11日
    浏览(44)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(37)
  • 【IMX6ULL驱动开发学习】10.设置uboot使用网络加载zImage和dtb

    首先根据这篇博客,保证自己的开发板与Ubuntu主机处于同一个网段,并且可以ping通 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段 1. 在uboot中设置网络 首先启动自己的板子进入Linux系统,使用 ifconfig 命令或者 ifconfig -a 命令查看自己网卡的地址 我的网卡地址是

    2024年02月11日
    浏览(42)
  • 【IMX6ULL驱动开发学习】19.mmap内存映射

    mmap将一个文件或者其它对象映射进内存 ,使得应用层可以直接读取到驱动层的数据,无需通过copy_to_user函数 可以用于像LCD这样的外设, 需要读写大量数据的 一、应用层 mmap用法: 用open系统调用打开文件, 并返回描述符fd. 用mmap建立内存映射, 并返回映射首地址指针start. 对映

    2024年02月16日
    浏览(37)
  • 【IMX6ULL驱动开发学习】12.Linux驱动之设备树

    承接上一篇博客 【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分) 代码获取: https://gitee.com/chenshao777/imx6-ull_-drivers 我后面将三个层合并了(实际上只有前两层),合并成一个dev_drv.c了,暂时没有加GPIO操作,只是个框架 合并前的代码在 11.butt

    2024年02月13日
    浏览(34)
  • 【IMX6ULL驱动开发学习】11.Linux之SPI驱动

    参考:驱动程序开发:SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器(控制器)数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数  二、SPI驱动模板 SPI驱动框架和I2C驱动框架是十分相似的,不同的是因为SPI是通过片选引

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包