交叉编译----宿主机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位的树莓派上也一样可以运行起来

相关推荐
CYRUS_STUDIO1 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
熊猫李1 天前
rootfs-根文件系统详解
linux
dessler1 天前
Hadoop HDFS-高可用集群部署
linux·运维·hdfs
泽泽爱旅行1 天前
awk 语法解析-前端学习
linux·前端
轻松Ai享生活2 天前
5 节课深入学习Linux Cgroups
linux
christine-rr2 天前
linux常用命令(4)——压缩命令
linux·服务器·redis
三坛海会大神5552 天前
LVS与Keepalived详解(二)LVS负载均衡实现实操
linux·负载均衡·lvs
東雪蓮☆2 天前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs
乌萨奇也要立志学C++2 天前
【Linux】进程概念(二):进程查看与 fork 初探
linux·运维·服务器
獭.獭.2 天前
Linux -- 信号【上】
linux·运维·服务器