程序编译生成的Hex、Bin、axf和elf格式
一、Bin
Bin文件是最纯粹的二进制机器代码,按照程序执行顺序存放。编译器把高级语言翻译成汇编,再把汇编代码翻译成二进制机器代码保存成bin文件,因此Bin是没有经过处理或附加信息程序原本的大小。Bin文件内部没有地址标记,因此下载程序的时候要指定bin的烧写地址,虽然大部分的单片机是从0地址开始执行程序,可也有些单片机不是,比如LPC1857。
二、Hex
Hex要比Bin高级一点,它增加了烧写地址、校验等信息。HEX文件由“记录(RECORD)”组成,每一行代表一个记录。每条记录都由一个冒号“:”打头,其格式如下:
:BBAAAATTHHHH...HHHHCC
BB:本记录中包含数据的字节个数。
AAAA:数据记录的开始地址,高位在前,低位在后。
TT: Type
00数据记录,用来记录数据。
01记录结束,放在文件末尾,用来标识文件结束。
02用来标识扩展段地址的记录
04扩展地址记录(表示32位地址的前缀)
HHHH:一个字(Word)的数据记录,高字节在前,低字节在后。TT之后共有 BB/2 个字的数据 。
CC: 占据一个Byte的CheckSum,把冒号后校验码前的数全部加起来取低16位,然后再取补码。
例1::011B50002272
BB= 0x01
AAAA = 0x1B50
TT=0x00
HH=0x22
CHECK SUM = ~((0x01+0x1B+0x50+0x22)&0xFF)+1 = 0x72
例2:
第1条记录长度为0x02,偏移地址为0000,类型是04,说明该记录为扩展段地址记录。数据为0000,校验和为FA。从这个记录的长度和数据,我们可以计算出基地址为0X0000。后面的数据记录都以此地址为基地址。
第2条记录中包含的数据长度为0x10(16字节),偏移为0004,类型为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个字节,记录的校验和为A3。此时的基地址为0X0000,加上OFFSET,这个记录里的16字节的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 其实有效的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5。
第3条记录的长度为00,LOAD OFFSET为0000,TYPE= 01,校验和为FF。类型为01,说明这个是一个END OF FILE RECORD,标识文件的结尾。HEX结束符一般以:00000001FF结尾。
三、Bin和Hex的比较
1、HEX文件包含地址信息,而BIN文件只包含数据本身。烧写或下载HEX文件时,一般不需要用户指定地址,因为HEX文件内部已经包含了地址信息。烧写BIN文件时则需要用户指定烧录的地址信息。
2、HEX文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此HEX文件至少需要2倍BIN文件的空间。
3、Hex记录中的数据部分就是Bin中的数据。
四、elf
ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:
(1)适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
五、axf
Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息。这些调试信息加在可执行的二进制数据之前。调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,只要axf除去调试信息后文件大小小于ram的大小即可。
调试信息有以下功用:
1、 可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。
2、 我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。
3、对变量进行跟踪(利用Watch & Call Stack Window)。
调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。以下几种方法可用来减少每个源文件产生的调试信息:
1、避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。
2、更改C/C++源文件,使#included包含的所有头文件有相同顺序。
3、尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。
4、程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项--remarks来产生警告信息;
六、总结
1、bin是源代码翻译出来的机器代码,设定好下载地址后,把bin下载到MCU中对应地址,然后MCU从那个地址就可以开始执行代码了。hex是加入了开始地址和校验的格式,可以不用设置下载地址直接下载到MCU中运行,当然下载到MCU中的只有hex记录中的数据部分。
2、axf和elf都是编译器生成的可执行文件。它们都是在源代码基础上添加了其他信息的形式,因此直接下载到MCU是不能运行的。elf要经过Linux OS操作系统处理才可运行,axf中带有调试信息,可能要配合Keil才可运行。
3、elf文件可以转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。Axf文件可以转化为bin文件,KEIL下可用以下命令fromelf -nodebug xx.axf -bin xx.bin即可。
程序编译生成的Hex、Bin、axf和elf格式相关推荐
- 一文弄懂BIN、HEX、AXF、ELF文件格式的区别
数据量比较 从存储数据的信息量上看:ELF>AXF>HEX>BIN,所以这也就确定了只能将大信息量的文件格式向小信息量的文件格式转换,如只能将HEX文件转换为BIN文件,当然如果指定 ...
- 各种烧写文件格式简介-ELF Hex Bin axf
转载地址:http://blog.chinaunix.net/uid-20321537-id-1966794.html 一,ELF Executable and linking format(ELF) ...
- Hex、bin、axf、elf格式文件小结
一.HEX Hex文件,一般是指Intel标准的十六进制文件.Intelhex 文件常用来保存单片机或其他处理器的目标程序代码.它保存物理程序存储区中的目标代码映象.一般编程器均支持生成此种格式文件. ...
- elf格式转换为hex格式文件的两种方法
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
- elf格式转换为hex格式文件的两种方法 1
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
- STM32的烧录和Hex/bin烧录文件解析
一.STM32的烧录 1. 用IDE工具烧录 可以配置IAR或Keil,用IDE下载.硬件工具需要使用ST-Link(分为SWD或Jtag方式,SWD连线少,比较常用于调试)或J-Link连接到板子的 ...
- ASCII HEX BIN DIG进制转换工具页
ASCII HEX BIN DIG进制转换工具页 http://www.ab126.com/goju/1711.html
- 【开发工具】【readelf】查看ELF格式文件工具(readelf)的使用
目录 readelf概述 readelf命令使用说明 readelf概述 readelf是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用.常见的文件如在Linux上的可执行 ...
- 一步步编写操作系统 47 elf格式文件分析实验
在上一节中,我们讲述了elf格式的部分理论知识,为什么是部分呢?因为我们本着"够用"的原则,只把我们需要了解的部分说完啦.不过,我相信大部分同学仅仅凭上一节中的理论知识还是领悟不到 ...
最新文章
- 自己闲来无聊弄的python小游戏,turtle实现海龟赛跑
- java postdelayed_你真的懂Handler.postDelayed()的原理吗?
- 领域计算机控制系统分为,计算机测控系统概述
- 编码问题(BOM头简单了解)
- stackoverflow上Java相关回答整理翻译
- Django日志模块配置
- BZOJ 3289 Mato的文件管理 | 莫队 树状数组
- php进度条如何计算,投票最后显示进度条的百分比怎么算
- php redis hgetall 慢,redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- SQL SERVER触发器(附有实例)
- MongoVue 使用技巧
- RK3568平台开发系列讲解(环境篇)RK3568 SDK Linux编译服务器开发坏境搭建
- 学一点Wi-Fi:WEP
- 关于统计检验中P值的解释
- [转贴] Crystal和Oscillator的区别
- xboxone硬盘坏的表现_希捷新酷鱼硬盘,这次必须要黑你一下了!
- 疯狂的架构,BAT加华为、联想、新浪公司组织结构图一览
- commitLint和husky实现代码提交校验
- ubuntu 上tp-link无线网卡驱动安装
- 使用QT设计师界面类创建2个界面,通过按键从界面1切换到界面2
热门文章
- MATLAB APPbase,使用HTTPD做内部访问转向
- php点击根据价格升降序,织梦列表页点击按价格按评分按更新按点击排序进行筛选方法...
- library not found for -lAPOpenSdk解决方案
- 基于深度学习的脑电图识别 综述篇(二)数据采样及处理
- EMD算法之Hilbert-Huang Transform原理详解和案例分析
- Google新WorldSense预告片:独立VR
- [unreal4入门系列之十六] UE4中的集合:TSet容器
- 传文件进云服务器,传文件进云服务器
- DeepMind丢掉了归一化,让图像识别训练速度提升了8.7倍 | 已开源
- 湖大深大A级学科数超南开,华科文科胜过武大!泰晤士的首份高校评级结果,让人有点方...