交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

1.交叉编译是什么,为什么要交叉编译

  • 编译:在一个平台上生成在该平台上的可执行代码
  • 交叉编译:在一个平台上生成在另一个平台上的可执行代码
  • 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下载到51单片机上即可运行
  • 要使用交叉编译的原因:
    (1)目的的平台上的资源贫乏,无法运行或安装我们所需的编译器
    (2)有时因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器
    (3)平台的运行至少需要的两样东西:bootloader(启动引导代码)和操作系统核心,这两样东西也是代码,同样需要进行编译为可执行代码才可运行,而此时原平台根本不支持编译,同样需要在其他平台上编译好可执行代码

2.交叉编译中的基础知识

  • 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
  • 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
  • 交叉编译需要用到的工具:交叉编译工具链

3.交叉编译工具链

gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz

4.安装交叉编译工具链

  1. 将下载好的压缩包通过ftp文件传输软件传到ubuntu中去,我用的是filezilla软件,这个软件免费好用,直接网上下载即可
  2. 解压压缩包

tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz

得到如下文件夹

  1. 进入到交叉编译工具链的bin目录下

cd gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin

然后查看交叉编译的工具版本看是否安装好

./aarch64-linux-gnu-gcc -v

出现上图所示的版本号后,表示我们此时的交叉编译工具是可以使用了的,但是因为没有配置环境变量,我们此时只能在这个文件夹的bin目录下进行使用,非常不方便,所以要配置环境变量方便使用

  1. 配置环境变量

首先使用

echo $PATH

查看自己的环境变量

将现有的环境变量复制下来

然后用

pwd

查看自己当前所在交叉编译工具链的bin目录的完整路径

将这个目录也复制下来,要将这个目录加入到环境变量中

最后回到回到工作目录,打开.bashrc这个隐藏文件

vi .bashrc

在文件的后面根据自己的交叉编译工具链bin目录的位置加入环境变量,

bash 复制代码
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/workspace/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/home/CLC/workspace/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin

接着输入

source /home/CLC/.bashrc

加载配置文件,马上生效配置。

这时在任意目录下输入

aarch64-linux-gnu-gcc -v

显示如下图所示,即表示交叉编译工具链安装完成了

5.交叉编译一个helloworld丢到树莓派上运行

  1. 编写一个test.c的文件
c 复制代码
#include <stdio.h>

int main()
{

        printf("hello world!\n");

        return 0;
}
  1. 交叉编译这个test.c文件

aarch64-linux-gnu-gcc test.c -o helloInArm64

此时如果在x86的平台上运行这个可执行文件就会报错

我们可以用

file helloInArm64

查看这个文件的属性

这里只显示了它是一个64位的可执行文件,但没有显示平台架构,我们将它这个可执行文件放到树莓派等相关的arm架构平台上他就会显示平台的架构

  1. 在树莓派上运行这个交叉编译后的文件
    先使用

file helloInArm64

查看文件属性

这时就会显示平台的架构了

然后直接运行

一个交叉编译的hellworld就运行成功了

一开始我安装的交叉编译工具是arm32位的,编译出来的可执行文件也是32位的,但我放到我64位的树莓派上也一样可以运行起来

相关推荐
拂拉氏1 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy6482 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io
Mikko72 小时前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos
书生执笔画浮沉2 小时前
分享一个开源小工具CAdapt
linux·c·gnu·glibc·kernel·升级·灵感
mounter6253 小时前
Linux 内核热升级(Live Update)技术详解:PCI、VFIO 与 IOMMU 子系统的演进与实战解析引言
linux·linux kernel·kernel·iommu·vfio
砚凝霜3 小时前
【软考信息安全】第十九章 Unix/Linux安全分析与防护
linux·安全·unix
creator_Li4 小时前
Linux 的 Page Cache
linux·page cache
KING-WU5125 小时前
Linux GDB 调试实战指南:从编译到断点调试
linux·运维·服务器
Lucis__5 小时前
深入理解程序链接与加载—从动静态链接到库加载
linux·elf·链接·程序·动静态库
影视飓风TIM6 小时前
Linux 进程信号原理与剖析
linux·运维·服务器