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

交叉编译器选择

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

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

交叉编译器命名规则

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

交叉编译器源码目录介绍

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

arm 交叉编译找不到so_嵌入式杂谈之交叉编译相关推荐

  1. 交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验

    实验六交叉编译及Linux简单程序设计实验的实验报告 一实验目的 1.了解和掌握交叉编译模式和方法: 2.熟悉和掌握Linux简单程序设计. 二实验环境 预装Fedora10_A8_Linux的pc机 ...

  2. arm 交叉编译找不到so_搭建交叉编译环境并验证

    1. 搭建编译环境并验证 1.1 实验目的 · 掌握嵌入式开发环境.交叉编译器的搭建.安装和配置方法 · 熟悉Linux应用程序的编译.调试方法,能够验证X86平台和ARM平台的差异 1.2 实验内容 ...

  3. arm 交叉编译找不到so_交叉编译v8时,提示找不到libstdc++.so.6里面GLIBCXX_3.4.20版本的某个符号...

    host:ubuntu12.04,gcc4.6,glibc2.15 target: x86, ia32,gcc4.9, glibc2.20 编译v8的时候,先编译host程序,然后用host程序产生一 ...

  4. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验

    <嵌入式实验6交叉编译及Linux简单程序设计实验>由会员分享,可在线阅读,更多相关<嵌入式实验6交叉编译及Linux简单程序设计实验(7页珍藏版)>请在人人文库网上搜索. 1 ...

  5. mysql 客户端 交叉编译_移植mysql到嵌入式ARM平台

    移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space.ph ...

  6. arm ubuntu 编译boost_Ubuntu交叉编译tslib并移植到嵌入式Linux

    一.交叉编译器 交叉编译器用于在Linux PC上编译嵌入式Linux平台上的项目(tslib),此处采用交叉工具链压缩包(gcc-4.4.4-glibc-2.11.1-multilib-1.0_Ea ...

  7. 交叉编译php-5.6.30,linux下用arm-none-linux-gnueabi交叉编译arm内核模块

    前不久导师要求交叉编译一个基于arm平台开发的内核模块来练手,在网上查了很多资料才弄出来,于是将这些零散的信息综合起来给和我一样的入门人员了解.水平有限,请谅解~ 1.安装arm-none-linux ...

  8. linux eclipse c++ 如何生成arm可执行文件_干货 | protobuf-c之嵌入式平台使用

    什么是protobuf-c 之前的文章:Protobuf:一种更小.更快.更高效的协议详细介绍了protobuf及protobuf-c.这里再简单提一下: Protocol Buffers,是Goog ...

  9. zynq7000系列移植—JRE移植到嵌入式ARM平台(java运行在嵌入式linux)

    转载:https://blog.csdn.net/weixin_39827918/article/details/78806642 前言 因公司项目需求,需要在zynq 7000平台下运行 java ...

最新文章

  1. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
  2. LightOJ 1348 Aladdin and the Return Journey
  3. windows如何实现视屏自动定时、全屏、轮播 播放
  4. Springboot 2.x 单元测试 JUnit 5
  5. .NET Framework 4.0源代码
  6. html中如何设置图片填充颜色渐变,实现SVG图标的渐变填充效果
  7. P1040 加分二叉树【dp+深搜】
  8. 微信小程序|area组件使用的地址数据文件plus
  9. php 函数内临时变量,在PHP中调用函数时使用临时变量
  10. 蒋鑫鸿:9,6国际黄金原油最新行情价格分析策略及今日投资操作建议
  11. 【微信小程序】横向/纵向布局(98/100)
  12. 利用正则截取匹配的字符串前后内容同
  13. 上货避坑指南 私域上货选品工具 无货源选品上货 采集商品详情数据API分享 详情图 sku信息
  14. 数组的filter方法,数组过滤方法
  15. 怎么更新opengl.dll文件_iOS 13更新体验:测试版升级教程!
  16. markdown使用数学符号/特殊符号
  17. Ubuntu下图片转pdf和pdf合并
  18. 基于springboot+vue个人博客搭建
  19. 华师大 OJ 3023
  20. 服务器补丁卸载之后显示未副本,打印机无法删除,添加打印机一直变成副本,怎样删除?急需答案?...

热门文章

  1. 电脑word在哪_到底哪个PDF转Word最好用?
  2. MySQL的索引存储数据结构BTree和B+Tree的区别
  3. Java中常用集合类对比_集合比较
  4. 怎么把word里面虚线变成实线_弱电不会制作cad图,花3分钟看完,只要会用WORD保证你能画出来...
  5. nginx配合python_人生苦短我用python[0x02] nginx与python结合
  6. 【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)
  7. java 反射api_Java学习笔记--反射API
  8. Mysql存储函数实现增删改查_使用存储过程操作数据库(实现增删改查)
  9. 数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池
  10. sqlserver慕课_SqlServer 操作 JSON