姓名:刘琛 学号:19020100265 学院:电子工程学院
转自:https://blog.csdn.net/weixin_38815998/article/details/103144982?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
【嵌牛导读】交叉编译器的基础介绍
【嵌牛鼻子】交叉编译器的原理和作用
【嵌牛提问】什么是交叉编译器?如何使用?
【嵌牛正文】
1. 什么是编译器以及交叉编译器
对于C语言程序,编译器是啥?通俗的来讲编译器就是把C程序“翻译”机器语言(二进制)的“翻译官”,那么编译器和交叉编译器有什么区别?下面通过一张图感受一下:
通过上面图我们可以很直观的看到使用编译器和交叉编译器去编译和执行程序大致流程是大同小异的,只不过交叉编译器的可执行程序需要从X86(PC)平台传送到ARM板平台提供用户执行。那么我们可能存在如下几个问题:
1. 交叉编译器编译出来的可执行程序可以在X86执行吗?
2. 为什么不直接在ARM平台编译?
3. ........?(欢迎评论补充)
2. 为什么需要交叉编译器
首先,我们先来分析一个问题:
2.1 为什么需要分普通编译器和交叉编译器?
这个问题涉及的知识面非常广,我们首先来看看两个编译器面向的平台,普通编译器面向的是X86平台,处理器绝大多数都是Intel的X86架构,注重的是性能,主频更高,多用于计算机领域;交叉编译器面向的是ARM平台,处理器大多数是ARM架构,注重性能和功耗平衡,多用于嵌入式领域。由于两者使用的指令集是有区别的,所以需要不用的编译语言,进而分开不同的编译器。
2.2 交叉编译器编译出来的可执行程序可以在X86执行吗?
上面也说了,X86和ARM的指令集是完全不同的,所以两者的可执行程序当然不具有两个平台运行的兼容性。
如何查看可执行程序属于的平台:
使用命令:file <文件名>
2.3 为什么不直接在ARM平台编译
其实这个是可以实现的,某些ARM平台的系统具有这样的编译环境,但是
因为通常编译工具链对编译环境有较高的要求,编译复杂的程序时,可能需要巨大的存储空间以及强大的CPU运算能力加快编译速度。常见的ARM架构平台资源有限,无论存储空间还是CPU运算能力,都与PC相去甚远,特别是对于MCU平台,安装编译器根本无从谈起。有了交叉编译,我们就可以在PC上快速编出译针对其他架构的可执行程序。
----《野火 i.MX+Linux开发实战指南》
在此插句话,推荐大家可以去看看正点原子和野火的ARM资料,目前已经开售板子和开放资料,ARM linux入门需要一个指路人,少走很多弯路。博主出生早了,入门学习时没赶上,现在去薅羊毛。。。。
3. 安装交叉编译器
3.1 交叉编译器介绍
(Ubuntu)安装交叉编译器主要有三种方式:
1. 下载 Linaro 制作好的第三方工具链(选择多)
2. 通过apt-get在线安装(方便快速)
3. 使用crosstool-ng 根据需要自己自作(复杂,不会)
主要介绍第一种:
Linaro 交叉工具链下载链接
选择最新(截止2019/11/19)的:7.4-2019.02
交叉工具链说明
名称 / 适用的平台
aarch64-linux-gnu / 适合64-bit Armv8 Cortex-A,little-endian(小端)
aarch64_be-linux-gnu / 适合64-bit Armv8 Cortex-A,big-endian(大端)
arm-linux-gnueabi / 适合32-bit Armv7 Cortex-A,soft-float(软件浮点),little-endian(小端)
arm-linux-gnueabihf / 适合32-bit Armv7 Cortex-A,hard-float(软件浮点),little-endian(小端)
armeb-linux-gnueabi / 适合32-bit Armv7 Cortex-A,soft-float(软件浮点),big-endian(大端)
armv8l-linux-gnueabihf / 适合32-bit Armv8 Cortex-A,soft-float(软件浮点),little-endian(小端)
接下来我们可以去分析我们的平台适用哪一种交叉工具链:
一般来说,根据使用的处理器就可以得到架构(Armv7 or Armv8),博主使用的是三星的S5P6818处理器,Cortex-A53内核,64位Armv8架构(兼容32位Armv7架构)。
但是最稳妥的办法还是去看看实际的系统信息:
使用命令查看系统属性:uname -a
可以看到我的系统属于armv7l架构,也就是选择:
arm-linux-gnueabi、arm-linux-gnueabihf
两者随便选吗?会发生如下错误:
3.3 分析平台支持的浮点计算方式
那么怎么确定系统是soft float还是 hard float 呢?我们可以通过一个巧妙的方法去确定,将ARM板上动态库文件(例如:/lib/libc.so.6)传输到PC上使用readelf查看文件信息(因为ARM板没有readelf工具):
可以看到,我的动态库属于soft-float类型文件,所以支持hard-float的平台也得看看动态库支持的类型。当然,你也可以静态编译文件,不是使用动态库,这样就可以支持hard-float(前提是硬件支持)。
我的是64位机,下载第二个,这个网站对于国内来说稳定性不行.
3.5 解压、配置和使用工具链
将工具链压缩包拷贝到 /usr/local/arm/ 目录下
这个路径是随意的,与后面的配置环境变量相关,但是usr(Unix Software Resource)目录下通常存放各类软件,工具链其实也就是一个软件。
重点关注 bin ,bin下存放的就是可执行程序,也就是我们需要的工具链。
include 是标准库文件的头文件存放目录,lib存放一些库文件。
做软链接(不是必须)
做软链接的目的就相当于 Windows 下创建一个快捷方式。不是必须但是方便使用。
配置环境变量,方便全局使用
打开家目录下的 .bashrc 在最后加入配置语句,.bashrc属于个人用户配置文件,PATH属于系统全局的变量,这样做的可以使工具链全局可见(也就是整个操作系统任意位置都可以使用 amr-linux-gcc ),操作如下图:
使环境变量立即生效(重启也行),查看工具链版本
4. 说在最后
其实工具链的安装和大多数linux工具的安装流程都是十分相似的:
下载工具 ---> 移动到指定位置 ---> 配置环境变量
通过配置工具也是去了解和熟悉操作系统工作原理的有效途径。