.axf /.hex/.bin/.elf文件类型知识整合(非自创)

一般bin、hex被称为镜像文件,即可执行文件,直接烧写到flash或内存中即可执行。

而axf是arm的调试文件,一般在针对arm调试过程中使用的文件,
不过通过专门工具也能直接将其中的真正代码部分(即axf中除了前后调试部分信息外的部分)烧写到flash中。
所以,有时候axf也称为镜像文件。

1).axf文件=调试信息+.bin文件

Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息,
这些调试信息加在可执行的二进制数据之前。
调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。
因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,
只要axf除去调试信息后文件大小小于ram的大小即可。

调试信息有以下作用:
1.可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。
2.我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call StackWindow查看)。
3.对变量进行跟踪(利用Watch & Call Stack Window)。

调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。
减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。
以下几种方法可用来减少每个源文件产生的调试信息:
1.避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。
2.更改C/C++源文件,使#included包含的所有头文件有相同顺序。
3.尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。
4.程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项–remarks来产生警告信息;

2).bin文件
真正的二进制文件,未添加任何其他信息。最纯粹的二进制机器代码,没有格式,文件的大小就是包括的数据的实际大小

3).hex文件(十六进制的英文名称:Hexadecimal)

指的是Intel标准的十六进制文件,并且是用一定文件格式的可打印的ASCII码来表示二进制的数值。
hex文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器都使用HEX文件。

HEX文件都是由记录(RECORD)组成的。
在HEX文件里面,两个16进制数字代表一个字节,每一行代表一个HEX记录,记录的基本格式为:
+—————————————————————+
| RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA| CHKSUM |
| MARK ‘:’ | | OFFSET | | | |
+—————————————————————+
| 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte |
+—————————————————————+
注:1-byte:2个字符
2-byte:4个字符

     记录类型包括:
     '00' DataRrecord:用来记录数据,HEX文件的大部分记录都是数据记录

     '01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

     '02' Extended Segment AddressRecord: 用来标识扩展段地址的记录

     '04' Extended Linear AddressRecord: 用来标识扩展线性地址的记录

    在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。
    对于每行后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。

以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)(Windows下文件都是如此,隐藏不显示)。
对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。

举例;完整的一个.hex文件:
:02 0000 04 0000 FA
:10 0000 00 18F09FE518F09FE518F09FE518F09FE5 C0
:10 0010 00 18F09FE5805F20B9F0FF1FE518F09FE5 1D
:10 0020 00 F00000004000000044000000A0000000 BC
:10 0030 00 A40000000000000000000000A8000000 74
:10 0040 00 FEFFFFEA040050E300F19F370EF0B0E1 3D
:10 0050 00 60000000700000008000000090000000 C0
:10 0060 00 00004FE1800080E300F061E10EF0B0E1 BC
…….
:10 FFF0 00 B000DDE142C1FFEB021080E3B000DDE1 C3
:02 0000 04 0001 F9
:10 0000 00 89C1FFEBB000DDE1010080E23CC1FFEB 04
:10 0010 00 021080E3B000DDE1010080E282C1FFEB 6D
:10 0020 00 0000D5E5800CB0E10200005A900C84E2 9B
:10 0030 00 B000CDE1010000EA920C84E2B000CDE1 15
:10 0040 00 B000DDE12EC1FFEB021080E3B000DDE1 86
:10 0050 00 75C1FFEBB000DDE1010080E228C1FFEB DC
…….
:10 FFE0 00 34870100588701002530326400000000 8A
:10 FFF0 00 256400001887010048870100F04F2DE9 B3
:02 0000 04 0002 F8
:10 0000 00 3CD04DE20100A0E320008DE57C021FE5 1D
:10 0010 00 80621FE52490D0E5040196E51C4F9FE5 22
:10 0020 00 80821FE5187F9FE50050A0E1E5AF00EB 5F
…….

:10 FFE0 00 76F8FFEA81F3FFEB5C00D8E5C00000E2 A1
:10 FFF0 00 040080E35C00C8E50000DBE5040080E3 6A
:02 0000 040003 F7
:10 0000 000000CBE52870C8E56CF8FFEA020050E3 79
:10 0010 000100000A010050E30100001A30F3FFEB 79
:10 0020 0066F8FFEA47F1FFEB64F8FFEA020050E3 ED
:10 0030 000100000A010050E30100001A41F1FFEB 4A
…….

:10 FFE0 002700A0E30A0000EA00069FE50C0086E5 72
:10 FFF0 000E00A0E3060000EAF4059FE50C0086E5 8C
:02 0000 040004 F6
:10 0000 000400A0E3020000EAFF00A0E3000000EA 11
:10 0010 00FF00A0E30310D6E5000051E10000009A C4
:10 0020 000300C6E50300D6E5080050E30000003A EF
…….

:10 FFE0 00380003003C003900030041003B000300 DF
:10 FFF0 0046003C0003004B003D00030050003E00 63
:02 0000 040005 F5
:10 0000 00030055003F0003005A00400003005F00 5A
:10 0010 0041000300640042000300690043000300 44
:10 0020 006E004400030073004400030078004500 A4
……..

:10 FFE0 00393A3A3B3C3D3D3E3F3F404142424344 2B
:10 FFF0 004445454647474848494A4A4B4B4C4D4D 76
:02 0000 040006 F4
:10 0000 004E4E4F4F505051515252535354545555 D8
:10 0010 0056565757585859595A5A5A5B5B5C5C5D 4B
:10 0020 005D5D5E5E5F5F60606061616262626363 CE
……..

:10 FFE0 0000000000000000000000000000000000 11
:10 FFF0 0000000000000000000000000000000000 01
:02 0000 040007 F3
:10 0000 0000000000000000000000000000000000 F0
:10 0010 0000000000007FFC000000000001C00600 9E
:10 0020 000000000006000380000000001803E0C0 8C
……..

:10 C910 00C8BB0600FFFFFFFFFFFF080000600040 EC
:10 C920 000064004000680040ABBC0700B3BC0700 D7
:00 0000 01 FF

下面取HEX文件中的一行:

:10 0000 00 [18 F0 9F E5 18 F0 9F E5 18 F0 9F E5 18 F0 9F E5]C0

“:”[0]:
表示一行的开始。

“:”后的第1,2个字符[1:2]:
表示本行包含的数据的长度,这里”10”就是0x10即16个。

“:”后的第3,4,5,6个字符[3:6]:
表示数据存储的起始地址,
“0000”这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。

“:”后的第7,8个字符[7:8]:表示数据的类型。
该类型总共有以下几种:
00 —-数据记录
01 —-文件结束记录
02 —-扩展段地址记录
04 —-扩展线性地址记录

这里就是0x00即为普通数据记录。

自后的32个字符:
表示本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据,跟行首的记录的长度相一致。

最后两个字符:表示校验码。

:00 0000 01 FF:每个HEX格式的文件的最后一行都固定为该行内容,01表示文件内容的结束。

4)ELF(Executable and Linking Format):是一种对象文件的格式
ELF文件类型: (三种)
a)可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。
b)可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。
c)共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。

——————–注意:—————————–
1)axf和elf都是编译器生成的可执行文件。
区别是:ADS编译出来的是AXF文件。
gcc编译出来的是ELF文件。两者虽然很像,但还是有差别的。
这是文件格式的差别,不涉及调试格式。

2)axf/elf是带格式的映象,bin是直接的内存映象的表示。
3)
Linux OS下,ELF通常就是可执行文件,通常gcc -o testtest.c,生成的test文件就是ELF格式的,
在Linux Shell下输入./test就可以执行。

在Embedded中,上电开始运行,没有OS系统,如果将ELF格式的文件烧写进去,包含一些ELF格式的东西,
arm运行碰到这些指令,就会导致失败,如果用bin文件,程序就可以一步一步运行

故:HEX和bin文件可以在裸机上运行,而ELF文件是在有OS的环境中运行的。

你可能感兴趣的:(.axf /.hex/.bin/.elf文件类型知识整合(非自创))