一、Hex
Hex文件由记录(RECORD)组成。在Hex文件里面,每一行代表一个记录。
形如 :BBAAAATTHHHH...HHHHCC
BB : 字节个数。
AAAA: 数据记录的开始地址,高位在前,低位在后。
TT : Type
00 数据记录,用来记录数据。
01 记录结束,放在文件末尾,用来标识文件结束。
02 用来标识扩展段地址的记录
04 扩展地址记录(表示32位地址的前缀)
HHHH:一个字(Word)的数据记录,高字节在前,低字节在后。TT之后共有BB/2 个字的数据 。
CC : 占据一个Byte的CheckSum
举例分析:
:020000040000FA:10000400FF00A0E314209FE5001092E5011092E5A3:00000001FF
第1条记录:
长度为0x02,Load offset为0000,Type为04,说明该记录为扩展段地址记录。数据为0000,校验和为FA。
第2条记录:
长度为0x10(16),Load offset为0004,Type为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个字节,记录的校验和为A3。
第3条记录:
长度为00,Load offset为0000,Type= 01,校验和为FF。类型为01,说明这个是一个END OF FILE RECORD,标识文件的结尾。Hex结束符一般以:00000001FF结尾。
从这个记录的长度和数据,我们可以计算出基地址为0x0000。后面的数据记录都以此地址为基地址。第2条记录此时的基地址为0x0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 其实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5。
二、Bin
Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。
三、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来产生警告信息; 5、使用编译命令行选项--no_debug_macros,从调试表中丢弃预处理宏定义。
四、Elf
Elf(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:
(1)适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。 ELF文件格式比较复杂。
总结:
1、Hex文件包含地址信息而Bin文件只包含数据本身,烧写或下载Hex文件时,一般不需要用户指定地址,因为Hex文件内部已经包含了地址信息。烧写Bin文件时则需要用户指定烧录的地址信息。
2、Hex文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此Hex文件至少需要2倍Bin文件的空间。
3、可由elf文件转化为Hex和Bin两种文件,Hex也可以直接转换成Bin文件,但Bin要转化为Hex文件必须要给定一个基地址。
4、Hex和Bin文件不能转化为elf文件,因为elf的信息量要大。
5、Axf文件可以转化为Bin文件,Keil下用命令fromelf-nodebug xx.axf -bin xx.bin即可。