arm 交叉编译找不到so_嵌入式杂谈之交叉编译

这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法),而这次的重点一方面是科普交叉编译器的相关知识,另一方面着重介绍怎么使用交叉编译器提供的各种工具完成相应的任务。 废话少说,上干货。

交叉编译器选择

首先认可一点,交叉编译器是一个软件工具,那既然是一个软件,那就必须知道这个软件是怎么来的,目前分为两种情况。 芯片厂商提供的或者开源的自己制作的交叉编译器 自己制作交叉编译器比较麻烦,步骤单一,但版本依赖关系大,而且必须了解编译原理,耗时费力

所以我们果断使用芯片厂商提供的或者开源的交叉编译工具链

交叉编译器命名规则

arm-none-linux-gnueabi-
最最常用的一种,
第一个单词表示编译得的什么目标架构的
第二个单词是厂商名,可以是三星或者恩智浦等,但开源的一般都为none
第三个单词表示程序编译出来的程序默认应用的系统,因为编译器的标准C库等是与Linux兼容的
第四个单词gnu表示gnu项目
第四个单词eabi指的是嵌入式接口
可以简写为以下形式
arm-linux-
arm-none-eabi-
表示编译出来的程序不支持操作系统

交叉编译器源码目录介绍

e0650e8115139adfc442b298dde33698.png

交叉编译器包含的目录如上图所示

  • bin目录相当于交叉编译的命令集合,包含了数十种工具
  • lib相当于交叉编译器运行的时候需要的库以及目标程序所需要的库。 在这里我们需要知道,交叉编译器本身是一个程序软件,所以交叉编译器的运行工作需要依赖库文件,另一方面交缠编译器需要将源文件进行编译,而编译得到的另一种架构上的代码运行也需要库文件。 这就说明,交叉编译器需要两种库,一种是它本身需要的,另一种是编译出来的程序需要的

添加交叉编译器命令到环境变量

为了让交叉编译器的命令不用制定目录运行,所以需要添加环境变量 (如果有不明白什么是环境变量的,还是最好百度一下)

  • 方案一: echo $PATH查看当前系统环境变量 echo xxx >> PATH追加路径到环境变量,只针对当前shell起作用
  • 方案二:
    编辑/etc/environment文件添加环境变量,可以永久保存,但是修改完这个文件以后需要使用source /etc/environment命令将环境变量进行更新

交叉编译器中嵌入式工具集合

  1. readelf
    我们通常理解的程序软件都是运行在操作系统之上的,但是有的程序不能在不同的操作系统之上运行。
    这是因为:
    我们最终编译出来的可执行程序分两部分:真正的程序文件以及头信息 不同操作系统的的格式是不同的,Windows上称为PE头,Linux上称为ELF头
    这个头部信息是专门给操作系统识别的。
    开发裸机的时候需要使用objcopy这个命令将头部信息取出来,留下真正的程序文件。
    因为带有头文件的程序刚开始不是可执行代码,裸机状态下无法执行,会导致程序一开始就卡死。
    所以我们在裸机开发的时候在得到二进制文件以后再处理一下就是可以理解的了(说实话,这一点我当时非常疑惑)readelf是读取可执行程序的头部信息objcopy是抽取头部信息然后丢弃掉
    使用方法: read -h 可执行程序名

e7fab5a5a8587c3f4adffba307713622.png

入口地址表示程序的运行地址,所以一些病毒程序可能就是修改了这个入口地址,相当于我们双击一个原来的程序的时候,直接跳转到了病毒程序。
综上所述,在可执行文件的头部有一个头信息可以被操作系统识别,进行解析 。
在Linux上使用file命令可以查看可执行文件的相关信息,比如运行平台架构 。

0a126c7d7c802cb09bc9805b5a9af414.png

2. size
读取可执行程序的大小 包含代码段,数据段,bss段等等

a1bfe42efbb3681ef890572f2d149872.png

当改变全局变量或者其他的时候,可以看到代码信息的改变 关于程序的各种也是一块比较大的知识点,有机会补一篇文章(狗头)
3.nm
符号列表的概念,最精简,最好用的工具。
可以查看可执行程序的符号表,比如程序中的全局标签

401cb5fa625365a10146b666e8f6ccbe.png

db33575a63de972754147f4de300cb63.png

T表示全局函数 D表示全局变量区 d表示 static 修饰的变量 t表示被 static 修饰的函数
4.strip
剔除符号表。
相当于将刚才说的符号表进行剔除。
因为程序运行的时候不需要符号表 使用file命令可以查看是否剔除符号表

b85ec818bcb808fc92e68050cc1b1c1c.png

剔除符号表以后文件大小会变得更小一点

a94feef5196dda89a5ab2cbc4c060c85.png

一般情况下,生产过程最后将最后的程序进行剔除符号表 只能自己架构的工具剔除自己架构的程序的符号表
5.strings
查看可执行程序的常量字符串

607c9e865e0fb0dc8c137c84786a57ca.png


6.objcopy
表示将头部信息拷出来,不然无法识别相应程序
7.objdump
反汇编程序 objdump -d <name> 或者 -D表示反汇编文件
8.addr2line
调试过程中将出错的结果及行号标志出来 但一般用不到

了解更多技术文章,欢迎关注我的个人公众号

b11ce975a3ad357bc64de2fc964fa5dd.png

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

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

相关文章

Java 10将如何改变您的编码方式

突出显示Java 10中新的Java局部变量类型推断功能 早在2016年&#xff0c;Java社区就掀起了新的JDK增强提案&#xff08;JEP&#xff09;&#xff1a; JEP 286 。 现在&#xff0c;两年后&#xff0c;局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员…

中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)

蒲公英路由器是由上海贝锐信息科技股份有限公司(oray)在2015年10月14日推出的一款路由器。它是一款采用VPC[3]技术实现智能组网的路由器。2台或多台使用&#xff0c;无需公网IP&#xff0c;能将异地局域网通过蒲公英组建成一个网络。这次刷固件的教程为蒲公英路由器x3/x3pro刷第…

还有更多REST技巧

在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和到期&#xff08; 客…

javaml_一些基于Java的AI框架:Encog,JavaML,Weka

javaml在进行编程收集情报工作时&#xff0c;我发现自己花了很多时间将Python代码转换为Java&#xff0c;通常对我的进度缓慢感到不耐烦&#xff0c;所以我一直在寻找替代方法。 我发现3&#xff1a; Encog – Heaton研究 Java语言 威卡 这绝不是深入的研究&#xff0c;我…

Spring Cloud Netflix尤里卡

本教程是关于Spring云Netflix Eureka的。 在这里&#xff0c;我们将创建eureka发现服务器和微服务&#xff0c;这些服务本身将注册到发现服务器和使用netflix客户端API的客户端中&#xff0c;以使用示例示例来发现服务并使用该服务公开的微服务。因此&#xff0c;我们将开发每个…

掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进

注&#xff1a;以下内容来自于网络,若有侵权请联系QQ3609400292进行删除。煤矿安全生产标准化管理体系基本要求及评分方法(试行)8.4 掘 进一、工作要求(风险管控)1.生产组织(1)煤巷、半煤岩巷宜采用综合机械化掘进&#xff0c;综合机械化程度不低于50%&#xff0c;并持续提…

vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

vc调用jni最终&#xff0c;当Lucene执行查询时&#xff0c;在初始设置后&#xff0c;真正的热点通常是相当基本的代码&#xff0c;该代码对整数docID&#xff0c;术语频率和位置的顺序块进行解码&#xff0c;并将它们匹配&#xff08;例如&#xff0c;对BooleanQuery并集或交集…

hide show vue 动画_jQuery动画效果

-------------------------------------------------------------------------------------------------------1. 隐藏和显示show()方法和hide()方法是jQuery中最基本的动画方法。在HTML文档里&#xff0c;为一个元素调用hide()方法&#xff0c;会将该元素的display样式改为“n…

使用Java的Selenium:Google搜索

1.概述 在本教程中&#xff0c;我们将探讨如何将Selenium与Java结合使用。 我们将使用Selenium打开Goog​​le&#xff0c;进行搜索&#xff0c;然后单击URL。 该代码在Github上可用。 2.什么是硒&#xff1f; Selenium使Web浏览器自动化。 就是这样 Selenium使我们能够模拟…

润乾报表分组求和_一招搞定各种报表合计需求

一、常用合计方案在有专业报表工具之前&#xff0c;常用的实现方案有&#xff1a;1&#xff09; SQL“select sum(字段) from 表 group by 字段 order by 字段“可以实现简单的分组数据合计、条件合计&#xff0c;这种方式有一个很明显的缺点&#xff0c;就是随着合计需求复杂度…

Spring Security 6.x 系列(12)—— Form表单认证登录注销自定义配置

一、前言 在本系列文章中介绍了 Form 表单认证和注销流程&#xff0c;对部分源码也进行详细分析。 本章主要学习 Spring Security 中表单认证登录注销的相关自定义配置。 二、自定义登录页面 Spring Security 表单认证默认规则中对未认证的请求会重定向到默认登录页面&…

中奖名单模板_春分纪中奖名单出炉~才艺主公用“树叶阵法”致敬率土!

在上周发起的“率土春分纪”活动里小率每天都能在后台中收获主公们的“春天故事”今天小率将优质投稿整理出来分享给各位主公1春分诗词春赋雨水以将兮&#xff0c;天微微复日暖&#xff1b;春分之临兮&#xff0c;地脉脉而野苏。美好触手可及&#xff0c;万事恰逢转机。且看柳嫩…

JDK 10的摘要Javadoc标签

JDK 10通过发行JDK-8173425 引入了Javadoc标签{summary} &#xff08;“ Javadoc需要一个新标签来指定摘要。”&#xff09;。 这个新标签允许开发人员显式指定Javadoc注释的哪些部分出现在“摘要”中&#xff0c;而不是依靠Javadoc的默认处理来寻找一个时间和空间来划定注释的…

用c语言写代码_如何避免用动态语言的思维写Go代码

由于招聘市场上Go工程师的供给量不足&#xff0c;所以在招人的时候我们招了不少愿意转型用Go语言进行开发的PHP工程师&#xff0c;不过虽说换了个语言&#xff0c;在他们代码的时候还是能发现很多PHP的影子。if语句后面非要带括号这种问题就不说了&#xff0c;这属于不懂事&…

java ee cdi_Java EE CDI依赖关系消歧示例

java ee cdi在本教程中&#xff0c;我们将向您展示如何避免CDI bean中的依赖关系消除歧义。 在CDI中&#xff0c;我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入。 依赖性消除歧义的问题是客户端如何在不同的实现中调用特定的实现&#xff0c;而不会发生任何错…

tfw文件如何导入cad_教你三维家3d设计软件如何导入cad文件

一、导入CAD户型图的&#xff0c;注意点&#xff1a;CAD图要求&#xff1a;除墙体外&#xff0c;其它线段不可出现&#xff0c;(如&#xff1a;门、柱子、窗、阳台、标注、家具、植物、摆件等)且墙体线条要闭合&#xff0c;保存DXF格式。第一步:点击户型图--本地上传CAD图。第二…

用EnumMaps映射枚举键

这是一种在JDK中存在很长时间的类型&#xff0c;当我们要定义以枚举类型作为键的映射时会派上用场&#xff1a; EnumMap是一种特殊的Map 。 我们将为给定的枚举创建一个映射&#xff1a; public enum CoffeeType {ESPRESSO, POUR_OVER, FRENCH_PRESS }EnumMap在创建时需要注意…

同级选择器_10-CSS3选择器详解

CSS3在CSS2基础上&#xff0c;增强或新增了许多特性&#xff0c; 弥补了CSS2的众多不足之处&#xff0c;使得Web开发变得更为高效和便捷。CSS3的现状浏览器支持程度不够好&#xff0c;有些需要添加私有前缀移动端支持优于PC端不断改进中应用相对广泛应对的策略&#xff1a;渐进…

机器人庄园作文_十年后的家乡作文精选8篇

十年后的家乡作文精选8篇十年后的家乡作文&#xff1a;十年后的家乡十年前我的家乡美丽富饶&#xff0c;家前的小溪清澈见底&#xff0c;小溪妹妹还&#xff1a;“哗啦啦”的唱起了欢乐的歌谣。树木葱葱茏茏&#xff0c;花朵都露出了美丽可爱的笑脸&#xff0c;蝴蝶、蜜蜂、小鸟…

java heroku_Heroku和Java –从新手到初学者,第2部分

java heroku问题 所以过了几天&#xff0c;我可以回到我的Recaps小项目。 我从检查日志开始&#xff0c;发现了以下内容&#xff1a; 2012-03-04T01:52:5100:00 heroku[web.1]: Idling 2012-03-04T01:52:5300:00 heroku[web.1]: Stopping process with SIGTERM 2012-03-04T01:…