ARM交叉编译

目录

一、介绍

1、本地编译

2、交叉编译

二、交叉工具链

1、概念

2、工具

3、获取方法

三、交叉编译运行程序

1、pc机操作(x86_64)

​2、开发板操作(ARM)


一、介绍

1、本地编译

        本地编译是在与目标运行环境相同的机器上进行的编译过程,也就是说,编译器和生成的可执行文件在同一个平台上运行

  • 相同平台:编译和运行代码的平台相同。
  • 简单性:配置和依赖关系比较简单,因为编译环境和运行环境是一致的。
  • 调试方便:可以直接在本机器上调试生成的可执行文件。

2、交叉编译

        交叉编译是在与目标运行环境下不同的机器上进行的编译过程。编译器生成的可执行文件是为另一种平台设计的

  • 不同平台:编译器所在的平台与目标运行平台不同。
  • 复杂性:配置和依赖关系更复杂,因为需要设置交叉编译工具链和目标平台的库和头文件。
  • 调试不便:生成的可执行文件不能在本地机器上运行,调试需要在目标平台上进行。

        简单地说,编译生成的可执行程序可直接在本机运行的叫本地编译。而在一个平台上编译出能在另一种体系结构完全不同的处理器上运行的程序叫交叉编译

        为什么要有交叉编译器呢?简单来说,就是嵌入式系统中的资源太少。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,支持本地编译。

二、交叉工具链

1、概念

         在嵌入式开发过程中有宿主机目标机的角色之分:宿主机是执行编译链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。

        在宿主机执行编译的流程如下:

         交叉工具链指的是将程序代码,编译成可执行文件的一系列工具,按照先编译后链接等相关的编译程序的内在逻辑串起来。交叉工具链主要由binutils、gcc和glibc组成。

        为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器gcc,链接器ld。

  • 编译:将程序代码生成目标平台的目标文件。
  • 链接:将多个目标文件和库文件链接在一起,生成可执行文件或库文件。

        其中,链接器ld只是处理操作目标文件,二进制文件的最主要的一个工具,而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar等等工具的。GNU官网弄出了一个二进制工具包,集成了这些和操作二进制相关的工具集合,叫做binutils。

        一句话概括就是自己平台上用于交叉编译的一系列工具就叫做交叉工具链。由于其中最最主要的是用于编译的gcc,所以,我们也常把:交叉工具链,简称为交叉编译器。即:严格意义上来说,交叉编译器,只是指的是交叉编译版本的gcc。但是实际上为了叫法上的方便,我们常说的交叉编译器,都是指的是交叉工具链。即,常说的交叉编译版本的gcc,比如arm-linux-gcc,实际上指代了,包含一系列交叉编译版本的交叉工具链(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)。

2、工具

工具名工具说明
gccc程序源码编译工具
g++c++程序源码编译工具
cppc程序预处理器
as将汇编源码汇编成目标机器代码.o文件
ar将多个可重定位的.o文件归档为一个静态库.a文件
ranlib产生归档.a文件索引,并将其保存到这个归档文件中,因为ar命令支持该特性,所以现在很少用了
ld链接器,用来将多个目标文件.o、静态库.a文件、动态库.so文件链接生成一个可执行文件
readelf列出ELF格式可执行文件的相关信息
nm列出目标文件中的函数符号表
size列出目标文件中每个段(text、data、bss等)的大小
strings列出目标文件中能打印出来的字符串
strip去掉目标文件中一些无关调试信息等,减小文件的大小
objcopy把一种目标文件中的内容复制到另一种目标文件中,裸机开发经常会用这个命令将ELF格式的文件转换成二进制文件
objdump该工具常用于对二进制进行反汇编,默认输出到标准输出,所以一般配合重定向一起使用
addr2line将程序地址转换为文件名、函数名和源代码行号,主要用来调试或反汇编

3、获取方法

        获取交叉编译器一般有两种方式,一种是直接从官网上进行下载,或者购买开发板的时候厂家会提供你对应的交叉编译器;另一种就是自己制作交叉编译器,如果我们从零开始做一个交叉编译器难度是很大的,所以正常情况下我们都是借助工具来制作交叉编译器,推荐使用crosstool-NG和buildroot(不仅能制作交叉工具链,而且还可以制作根文件系统rootfs。而且还支持同时编译对应的Linux内核和Uboot)。

三、交叉编译运行程序

1、pc机操作(x86_64)

(1)在.bashrc中设置交叉编译路径

(2)编写程序并编译

 (3)将执行文件上传至本地文件中

 2、开发板操作(ARM)

(1)我的板子不支持scp传输命令,所以我这里采用的tftp命令(我这里用了tftp32软件,下载资源下面给大家了,可以免费下载)。

 (2)连接开发板,下载运行文件

           通过一个简单的hello程序,为大家整理了交叉编译的流程。由于每个人的开发板不同,所以设置可能略有不同,但是原理都是一样的,大家哪里遇到问题可以私信问我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 程序结构 -- Java 语言的变量、方法、运算符与注释

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 003 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【数据结构】详解堆排序当中的topk问题(leetcode例题)

文章目录 前言如何理解topk问题代码逻辑代码实现 前言 Leetcode相关题目:215. 数组中的第K个最大元素 如何理解topk问题 **Top K 问题是一个经典的问题,在计算机科学中,它的目标是在一组数据中找到前 K 个最大或最小的元素。**这个问题在许…

Vue3学习记录第三天

Vue3学习记录第三天 背景说明学习记录Vue3中shallowReactive()和shallowRef()Vue3中toRaw()和markRaw()前端...语法Vue3中readonly()和shallowReadonly()函数前端的防抖 背景 之前把Vue2的基础学了, 这个课程的后面有简单介绍Vue3的部分. 学习知识容易忘, 这里仅简答做一个记录…

【C++进阶】深入STL之 栈与队列:数据结构探索之旅

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现list与迭代器 🌹🌹期待您的关注 🌹🌹 ❀stack和queue &#x1f4…

安利一款非常不错浏览器文本翻译插件(效果很不错,值得一试)

官网地址:https://immersivetranslate.com/ “沉浸式翻译”这个词,由我们发明创造。如今,它已然成为“双语对照翻译”的代名词。自2023年上线以来,这款备受赞誉的 AI 双语对照网页翻译扩展,已帮助超过 100 万用户跨越语…

DevOps的原理及应用详解(三)

本系列文章简介: 在当今快速变化的商业环境中,企业对于软件交付的速度、质量和安全性要求日益提高。传统的软件开发和运维模式已经难以满足这些需求,因此,DevOps(Development和Operations的组合)应运而生,成为了解决这些问题的有效方法。 DevOps是一种强调软件开发人员(…

uni-app uni-swipe-action 滑动操作状态恢复

按照uni-app官方文档的写法 当前同一条滑动确认之后 页面列表刷新 但是滑动的状态还在 入下图所示: 我们需要在滑动确认之后 页面刷新 滑动状态恢复 那么我们就来写一下这部分的逻辑: 首先,配置一下:show"isOpened[item.id]" chan…

探地雷达正演模拟,基于时域有限差分方法,二

回顾上一章的内容,首先是探地雷达的使用范围和其主要面向的地球物理勘探对象,其次是Maxwell方程及FDTD基础知识,本章的内容包括:1、基于C的TE波波动方程实现 2、边界问题的产生及处理。 一、基本波动方程实现: 使用C…

SpringBoot的Mybatis-plus实战之基础知识

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 三、配置文件四、加解密实现步骤 在SpringBoot项目中使用Mybatis-plus,记录下来,方便备查。 MybatisPlus 介绍 为简化开发而…

[数据集][目标检测]厨房积水检测数据集VOC+YOLO格式88张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):88 标注数量(xml文件个数):88 标注数量(txt文件个数):88 标注类别数…

【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(附源码)(下篇)

作者:后端小肥肠 上篇:【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(上篇)_spring security activiti7-CSDN博客 目录 1.前言 2. 核心代码 2.1. 流程定义模型管理 2.1.1. 新增流程定义模型数据 …

Internlm_xcomposer2模型结构解读

Internlm_xcomposer2模型结构解读 项目地址 Internlm_xcomposer2模型总体结构 <class transformers_modules.internlm-xcomposer2-4khd-7b.modeling_internlm_xcomposer2.InternLMXComposer2ForCausalLM> InternLMXComposer2ForCausalLM((model): InternLM2Model((tok_…

阻塞队列和线程池

一、什么是阻塞队列 1.1 什么是队列 队列是先进先出。 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队…

Redis 双写一致原理篇

前言 我们都知道,redis一般的作用是顶在mysql前面做一个"带刀侍卫"的角色,可以缓解mysql的服务压力,但是我们如何保证数据库的数据和redis缓存中的数据的双写一致呢,我们这里先说一遍流程,然后以流程为切入点来谈谈redis和mysql的双写一致性是如何保证的吧 流程 首先…

10.1 Go Goroutine

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

transformer 位置编码源码解读

import torch import mathdef get_positional_encoding(max_len, d_model):"""计算位置编码参数&#xff1a;max_len -- 序列的最大长度d_model -- 位置编码的维度返回&#xff1a;一个形状为 (max_len, d_model) 的位置编码张量"""positional_e…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

国内外网络安全现状分析

一、国内网络安全现状 1.1 国内网络安全威胁 国内的网络安全威胁主要表现在以下几个方面&#xff1a; 恶意软件&#xff1a;包括计算机病毒、蠕虫、木马和间谍软件等&#xff0c;它们能感染计算机系统、窃取敏感信息或破坏系统功能。网络钓鱼&#xff1a;通过伪装成可信任的…

27-LINUX--I/O复用-poll

一.poll概述 poll是一个多路复用的I/O模型&#xff0c;一个进程监视多个文件描述符&#xff0c;当文件描述符就绪时&#xff0c;poll返回可读并做相应处理。 1.poll的模型 #include <poll.h>struct pollfd {int fd; //文件描述符short events; //事件类型 s…

OpenAI新研究破解GPT-4大脑,分解1600万个特征打开“黑匣子”,Ilya 、Jan Leike也参与了!

6月7日凌晨&#xff0c;OpenAI在官网发布了一个新的研究成果&#xff0c;首次破解GPT-4的神经网络活动。通过改进大规模训练稀疏自动编码器将GPT-4的内部表示分解为 1600 万个特征。而且&#xff0c;前段时间离职的Ilya Sutskever、Jan Leike也是作者之一&#xff01; 这不是破…