简单交叉编译学习

交叉编译

交叉编译是在一个平台上生成另一个平台上的可执行代码。 同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
通常是自己的电脑写好代码编译之后发到嵌入式设备或者盒子之类的去执行,或者另一个版本系统没有的东西,例如opencv,从有的系统版本编译到没有的系统版本中

本文目标

在x86_64服务器上编译一个arm或者aarch64的文件,并且在对应的机器上可以执行

简单概念了解( 来源

  • GCC 的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]-gcc
    比如 arm-linux-gnueabi-gcc , arm-none-eabi-gcc, aarch64-linux-gnu-gcc
  • arch:芯片架构,比如 32 位的 Arm 架构对应的 arch 为 arm,64 位的 Arm 架构对应的 arch 为 aarch64
  • vendor :工具链提供商,大部分工具链名字里面都没有包含这部分
  • os :编译出来的可执行文件(目标文件)针对的操作系统,比如 Linux
  • arm-none-eabi-gcc 一般适用用于 Arm Cortex-M/Cortex-R 平台,它使用的是 newlib 库
  • arm-linux-gnueabi-gcc 和 aarch64-linux-gnu-gcc 适用于 Arm Cortex-A 系列芯片,前者针对 32 位芯片,后者针对 64 位芯片,它使用的是 glibc 库。可以用来编译 u-boot、linux kernel 以及应用程序
  • 32 位的 Arm 和 64 位的 Arm,它们的指令集是不同的,所以需要使用不同的工具链。当然,Arm64 为了保证前向兼容,提供了一个 32 位的兼容模式,所以我们用 arm-linux-gnueabi-gcc 编译的应用程序也是可以直接在Arm64 的系统上运行的,但是 Linux Kernel 和 U-Boot 就不行,除非你提前把 CPU 切换到 32 位模式。曾经有个项目使用了一颗四核的 Arm64 芯片,但是内存只有64M,为了节省空间,在 CPU 运行到 U-Boot 之前,我们就把它切到了 32 位模式,后面的 U-Boot、Linux Kernel,应用全部都用 32 位编译,加上 Thumb 指令集,节省了不少空间
  • make:类似批处理的程序,来批处理编译源文件
  • makefile:make批处理编译规则文件
  • cmake:读入所有源文件之后,自动生成makefile
  • cmakelist:cmake所依据的规则
    简单交叉编译学习
    图片来源

工具链的下载安装

  • 下载
    推荐直接使用国内的镜像下载
## 来源https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/   //对比原文的少了一个s,清华把文件库路径进行了整理
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xz
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz

名词解释来源
* abi:二进制应用程序接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
* eabi:嵌入式的abi,可以看作是一种简化的abi,体积小,运行快,适合嵌入式设备的
* gnueabi:The GNU C compiler for armel architecture,适用于armel架构 针对旧的 32 位 ARM 处理器,而不支持硬件浮点单元(FPU)
* gnueabihf: The GNU C compiler for armhf architecture,适用于armhf架构,仅适用于较新的 32 位 ARM 处理器,其至少实现了 ARMv7 架构,且支持 ARM 矢量浮点规范(VFPv3)
第 3 版,开启需要硬件的支持,在Debian的wiki上要求ARMv7 CPU、Thumb-2指令集以及VFP3D16浮点处理器。
* arm64: 适用于 64 位 ARM 处理器,其至少实现了 ARMv8 架构

gnueabi和gnueabihf其实是gcc的选项-mfloat-abi的默认值不同,gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):

  1. soft : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
  2. softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
  3. hard : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。

  4. 解压

xz -d gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xz
xz -d gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz
  • 安装
sudo mkdir -p /usr/local/toolchain  //目录可以更改,但是更改之后后续的目录也需要一起更改
tar -xvf gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar -C /usr/local/toolchain/
sudo tar -xvf gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar -C /usr/local/toolchain/
ls /usr/local/toolchain/
//输出gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf  gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu
  • 添加环境变量
vim ~/.bashrc
PATH=$PATH:/usr/local/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin:/usr/local/toolchain/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu/bin //将这句话加到文件的末尾
source ~/.bashrc //使配置生效
arm-linux-gnueabihf-gcc -v //输出gcc的版本号
aarch64-linux-gnu-gcc -v //输出gcc的版本号

编译

  • 我们在 /root下添加一个c文件并写入内容
sudo cd /root && cat << EOF > hello.c
#include <stdio.h>

int main()
{
  printf("hello world \n");
  return 0;
}
EOF
</stdio.h>
  • 执行编译
    make编译和arm-linux-gnueabihf- 编译是一个效果,make命令执行的时候会去找makefile,在makefile中找到需要编译的版本,然后去执行对应的编译命令,而arm-linux-gnueabihf-这种是直接指定了编译版本
arm-linux-gnueabihf-gcc hello.c -o armHello //&#x7F16;&#x8BD1;arm&#x7248;&#x672C;&#x7684;armHello&#x6587;&#x4EF6;&#xFF0C;&#x5728;arm&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;./armHello&#x6267;&#x884C;
aarch64-linux-gnu-gcc hello.c -o aarch64Hello //&#x7F16;&#x8BD1;aarch64&#x7248;&#x672C;&#x7684;aarch64Hello&#x6587;&#x4EF6;&#xFF0C;&#x5728;aarch64&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;./aarch64Hello&#x6267;&#x884C;

执行

  • 上传文件到指定的服务器
scp -P 22 /root/armHello root@192.168.1.66:/root/armHello  //-P 22 &#x53EF;&#x4EE5;&#x7701;&#x7565;&#xFF0C;&#x6307;&#x5B9A;&#x7AEF;&#x53E3;&#x53F7;&#xFF0C;&#x5047;&#x8BBE;192.168.1.66&#x662F;arm&#x7684;&#x670D;&#x52A1;&#x5668;,&#x9700;&#x8981;&#x8F93;&#x5165;&#x767B;&#x9646;&#x5BC6;&#x7801;
ssh root@192.168.1.66 //&#x8F93;&#x5165;&#x5BC6;&#x7801;&#x767B;&#x9646;
cd /root && ./armHello
## aarch64Hello&#x6D4B;&#x8BD5;&#x6267;&#x884C;&#x4E5F;&#x662F;&#x4E0A;&#x9762;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x6700;&#x540E;&#x7684;&#x8F93;&#x51FA;&#x5E94;&#x8BE5;&#x662F;
hello world

小白学习,错误之处欢迎指正

参考链接

https://cloud.tencent.com/developer/article/1571937
https://www.runoob.com/linux/linux-comm-scp.html
https://blog.csdn.net/forgetjoker/article/details/116295386
https://zhuanlan.zhihu.com/p/340444117 //推荐阅读
https://openskill.cn/article/1780 //推荐阅读
https://www.cnblogs.com/xiaotlili/p/3306100.html //推荐阅读
https://www.cnblogs.com/zhangjiankun/p/4852899.html //推荐阅读

Original: https://www.cnblogs.com/spatxos/p/16544176.html
Author: spatxos
Title: 简单交叉编译学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582902/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MACOS Terminal终端:更改zsh模式到bash模式(切换shell)

    MACOS Terminal终端:更改zsh模式到bash模式(切换shell) 一、GUI界面切换: preferences… -> shell open wi…

    Linux 2023年5月28日
    0175
  • WPF 切换主题使用 luna 复古版本

    本文告诉大家如何在 WPF 里面使用 luna 等复古主题 今天在 lsj 说他准备优化 WPF 的程序集时,准备删除 luna 等程序集时,找到了一段有趣的注释,发现在 WPF …

    Linux 2023年6月6日
    082
  • 对抗攻击方法BIM与PGD的区别

    Basic iterative method(BIM):论文地址 笔记地址 Projected gradient descent(PGD):论文地址 笔记地址 区别1 来自于:ht…

    Linux 2023年6月7日
    0100
  • jenkins 设置钉钉机器人+jenkins调用shell脚本使用钉钉机器人自定义发消息并通知指定人

    两种钉钉通知方式,一种是使用安装的钉钉插件来通知,但是这个不好定义通知内容,没办法控制发送条件,只要配置了,不管构建参数(分支,渠道,配置),都会发通知,第二种是使用脚本的方式来通…

    Linux 2023年5月28日
    091
  • 快速删除指定文件夹下的.DS_Store文件

    清除当前文件夹中 .DS_store 文件: find "." -name .DS_Store find "." -name .DS_Sto…

    Linux 2023年6月14日
    076
  • Docker安装教程

    这里介绍两种安装方法:centsOS安装和Ubuntu安装 CentOS安装 linux内核版本建议3.8以上,作者本人使用的是3.10;查看内核版本命令:uname -r 一般C…

    Linux 2023年5月27日
    0115
  • 就业班第一周作业

    是由 Patrick Volkerding 开发的 [GNU/Linux]发行版,于 1993 年创建,最初基于 Softlanding Linux System。典型代表系统是S…

    Linux 2023年6月13日
    081
  • Docker容器搭建android编译环境

    Docker容器搭建android编译环境 .版本:v0.4作者:河东西望日期:2022-7-12. 1.1 手动部署 &#x5B89;&#x88C5;&#…

    Linux 2023年6月7日
    099
  • 2-第一个Django程序

    第一个Django程序 从本章节开始将通过实现一个投票应用程序,来让用户逐步的了解Django。这个程序由两步分组成: 公共站点,允许用户访问进行投票,和查看投票。 站点管理,允许…

    Linux 2023年6月7日
    0112
  • MySQL常见操作

    1.登录 mysql -uroot -p 2.如何查询数据库服务器中所有的 mysql> show databases; 3.如何选中一个数据库进行操作 mysql>u…

    Linux 2023年6月7日
    099
  • gerrit系统如何配置访问控制

    .版本:v0.3作者:河东西望日期:2022-7-13. gerrit系统的上手使用有两个难点: 想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerri…

    Linux 2023年6月7日
    096
  • 【论文笔记】Towards Certifying l-infinity robustness using neural networks with l-infinity-dist neurons

    原文地址 slides GitHub 代码 本文发表于 2021 ICML,提出了一个新颖的神经网络计算方式:对于网络中的每个神经元,不采用传统的线性转换+非线性激活函数的方式,而…

    Linux 2023年6月7日
    081
  • Centos7升级内核

    1、查看当前内核版本 $ uname -r 3.10.0-1160.25.1.el7.x86_64 $ uname -a Linux localhost.localdomain 3…

    Linux 2023年6月13日
    074
  • 什么是视频编码?编解码器和压缩技术

    想知道什么是视频编码,为什么它很重要? 在本文中,我们将研究编码、编解码器和压缩技术的过程。这包括什么使得一个推荐的编解码器,虽然是取决于情况。它还涵盖了为什么某些伪影,与压缩有关…

    Linux 2023年6月7日
    0114
  • NJU软件分析笔记(3)

    NJU Static Analysis Notes(3)——Data Flow Analysis Ⅱ 课程链接本次课程主要内容 Live Variables Analysis Av…

    Linux 2023年6月8日
    0122
  • node热加载

    node可以通过require热加载文件,这里先提一下require的加载方式:当我们第一次使用require加载模块时require会把被加载文件的绝对路径作为key存放在req…

    Linux 2023年6月14日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球