简单交叉编译学习

交叉编译

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

大家都在看

  • docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Doc…

    Linux 2023年6月14日
    0107
  • 标签泄露 Label leaking

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    099
  • shell handle

    !/bin/bash qinrui set -e commitId =” repoPath =” x1 =” if [-f changes15….

    Linux 2023年5月28日
    0111
  • 常见题目

    这几天有朋友反映给小编说让多发点关于面试的文章,小编深知从事IT行业的难处,跳槽多,加班多,薪资不乐观,大多数朋友都想找新的工作,进入一个好的公司,今天小编就给大家带来了C语言面试…

    Linux 2023年6月13日
    0101
  • Python:给定一个不超过5位的正整数,判断有几位

    方法一:作比较 方法二:使用整除实现,除完后如果是个0或不是个0,这种方法引入了计算,效率会降低,所以能加就不要减,能乘就不要除,能不计算就不计算 方法三: 方法四:字符串处理实现…

    Linux 2023年6月7日
    0102
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Linux 2023年6月6日
    0113
  • CKS考试心得分享

    CKS证书 考试相关 考试报名准备 CKS考试和CKA考试一样,已经开放中国大陆的考试。但区别是CKS目前没有中文题目,考试都是英文题目,唯一区别是CKS中文考试是中文老师监考,仅…

    Linux 2023年6月13日
    0123
  • linux与windows的批处理应用

    本文主要记录一下,不同服务器部署springboot项目时,用到的批处理命令 linux,针对maven-assembly-plugin打的tar.gz包的springboot项目…

    Linux 2023年6月14日
    0109
  • 实验一 密码引擎-4-国䀄算法交叉测试

    任务详情 0 2人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1 在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码…

    Linux 2023年6月8日
    0106
  • 招人、找人、找大牛啦!

    招人、找人、找大牛啦! 有意从事、投资TO B业务,含新型操作系统、大数据、人工智能、高性能计算、分布式应用软件的研发、高管、合伙人朋友请联系我,我司正在启动新一轮业务拓展!详情私…

    Linux 2023年6月6日
    0104
  • 初识pytest

    现在这份工作一直做硬件和算法方面,但本人还是很喜欢玩web,所以自学分享一下。 如何安装pytest 其实很简单 pip install pytest pip install -U…

    Linux 2023年6月8日
    0103
  • zabbix用户,角色,权限,模板管理

    zabbix用户,角色,权限,模板管理 用户组 用户角色 用户 使用刚才创建的用户登录 模板组 模板 模板的监控项可以自己创建也可以从其他模板复制 posted @2022-09-…

    Linux 2023年6月13日
    0128
  • redis

    PHP-redis:http://pecl.php.net/package/redis PHP-redis中文文档(redis各种方法介绍):http://www.cnblogs….

    Linux 2023年5月28日
    097
  • 跳石板—牛客网

    #include #include #include using namespace std; //计算第i个&#x7684…

    Linux 2023年6月13日
    0130
  • 2-第一个Django程序

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

    Linux 2023年6月7日
    0120
  • 设计模式——–原型模式

    原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式的核心是一个clone方法,通过该方法进行对象的拷贝。 代码实例 原型模式的优点:性能更加优…

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