bin、hex、axf和elf文件格式

发布时间 2023-11-14 21:06:26作者: NJ_Leon

2023-11-10    https://www.cnblogs.com/NJ-Leon/

一、概述

  bin文件:纯粹的二进制文件,裸机条件下运行的是bin文件。文件本身不包含任何地址信息,烧写bin文件到flash时,必须要指定地址。

  hex文件:intel格式文件,它里面除包含精华的bin部分还有地址、类型、校验等标记信息,常被用作很多ISP工具的文件格式。

  axf文件:arm调试格式文件,除了包含bin和地址、类型、校验等标记信息外,还包含调试相关的信息。

  elf文件:可执行与可链接格式的目标文件,这种文件需要在有OS的支持下才可以运行。如果将elf文件放到裸机中运行,肯定会出错。

二、bin文件

  bin 是 binary 的缩写,直白的翻译即为二进制文件,在这里理解为可执行的机器代码(程序)文件,因为计算机存储只有 0 和 1。

  bin 相对于hex、axf是一种最简单的程序文件,只有程序数据,程序文件有多大,程序也就多大。因此,你下载 bin 程序文件的时候,必须要设置起始地址。

三、hex文件

  hex 格式文件由 Intel 制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载到处理器里面的ASCII文本文件。

  1. 格式

  hex行格式:

  :BBAAAATT 【D···D】CC

   

其中:

代表行开始,固定为冒号:

BB代表Bytes,数据长度

AAAA代表Address,地址

TT代表Type,数据类型(标识)

D···D代表Date,数据

CC代表CheckSum,校验和

说明:

BB数据长度,也就是D···D这个字段的数据长度;

AAAA地址,起始地址、偏移地址,根据数据类型(TT)有关;

TT数据类型(标识):

  • 00:数据标识

  • 01:文件结束标识

  • 02:扩展段地址

  • 04:线性地址

  • 05:线性开始地址

  (地址代表高16位地址,也就是要向左移16bit)

CC校验和计算公式:

CheckSum = 0x100 - (Sum & 0xFF)

2. 例子说明

不同数据类型个行数据略有差异,先再看下00(数据类型)的格式:

一个常见hex文件:

1 :020000040800F2
2 :1000000000040020B1010008FD020008BD02000844
3 :10001000F902000801020008350400080000000091
4 :1000200000000000000000000000000021030008A4
5 ···省略数行
6 :100470000000024084040008000000200004000086
7 :040480004804000824
8 :040000050800019955
9 :00000001FF

  1.04类型:线性地址行

   :020000040800F2 

02:数据长度,这里是(0800)地址的2字节长度;
0000:偏移地址,这里数据其实无效;
04:线性地址数据类型;
0800:线性起始地址,左移16位,即:0x0800 0000;
F2:校验和

F2 =  0x100 - (0x02 + 0x04 + 0x08);

比如,修改起始地址为0600:

2.00类型:数据行

 :1000000000040020B1010008FD020008BD02000844 

10:数据长度,这里是16字节(程序)数据的长度;
0000:偏移地址,数据第一行偏移0000地址,第二行就是偏移0010,第二行就是偏移0020,依次偏移到FFF0;

如果偏移到FFF0,则会重新下一个起始地址,一段程序你就明白了:

1 :10FFD000D0C5CFA20D0A00003052010810B50A4862
2 :10FFE00002F0FEFC09A002F0FBFC14A002F0F8FCF9
3 :10FFF0001EA221A123A002F0F3FC2CA002F0F0FC31
4 :020000040801F1
5 :10000000394802F0EDFC10BD3C5301080D0A2A20CE
6 :1000100020202020202020202020202020202020E0
7 :100020002020202020202020202020414756D6C7F5

  00:线性地址数据类型;
  00040020B1010008FD020008BD020008:程序数据,就是bin文件里面的纯程序数据;
  44:校验和

  44 =  0x100 - (0x10 + 0x04 + 0x20 + 0xB1 + 0x01 + 0x08 + 0xFD + 0x02 + 0x08 + 0xBD + 0x02 + 0x08 + 0x44) & 0xFF;

  3.01类型:文件结束行

   :00000001FF 

00:数据长度;
0000:偏移地址,这里数据其实无效;
01:代表文件结束
FF:校验和

  这里代表hex文件结束了,有些公司为了使hex传输(下载)更可靠,或通过工具(或命令在)结束行后面追加校验信息,一般远程升级会考虑更多校验信息。

  看到这里,我相信很多人都能写一个脚本工具,让hex转为bin文件。

四、axf文件

axf格式文件是针对ARM编译器的一种格式文件,它是由 ARM 编译器产生。
axf文件除了包含程序数据(bin)和地址(hex)等数据之外,还包含调试信息。
axf文件内的调试信息附加在程序文件中,有助于分析和调试。
axf文件的调试信息作用:

  • 可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。

  • 还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。

  • 对变量进行跟踪(利用Watch & Call Stack Window)。

当然,axf文件调试信息的包含的内容有限,并非所有源码(及注释)相关信息都会包含在其中,想要有效调试,还是需要结合源代码工程进行调试。

五、elf文件

  在嵌入式Linux中还有一种文件 ELF(Executable and Linkable Format,可执行与可链接格式)也算是一种程序文件,这种文件包含信息更多、更复杂。

  elf是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。 - - - 来源百度百科

elf文件和bin、hex、axf文件同样属于可执行文件这一类,但是他们之间差异还是很大,elf文件包含的信息更多,也更复杂。

elf格式文件由四部分组成:

  • ELF header:ELF头

  • Program header table:程序头表

  • Section:节

  • Section header table:节头表

  

ELF header:描述整个文件的组织。
Program Header Table: 描述文件中的各种segments,用来告诉系统如何创建进程映像的。
Section:是从运行的角度来描述elf文件,sections是从链接的角度来描述elf文件,也就是说,在链接阶段,我们可以忽略program header table来处理此文件,在运行阶段可以忽略section header table来处理此程序(所以很多加固手段删除了section header table)。从图中我们也可以看出,segments与sections是包含的关系,一个segment包含若干个section。
Section Header Table: 包含了文件各个segction的属性信息。