基础很重要!elf和map文件有不同?
在做MCU开发的过程中,我们以Keil MDK为例简单介绍一下,通常我们会看到一些后缀的文件名,比如.bin
文件,.hex
文件,.axf
文件,.map
文件,.elf
文件,当然还有很多其他的文件,这里我们先简单介绍一下,先说.elf
吧。
.bin
bin文件就是二进制文件,完全有0和1组成;当然了,所有的文件最终的本质都是0和1,不过这里的bin文件应该面向机器的文件了,机器可以读懂它,而人很难读懂。我们所熟悉的文本文件,是通过多种编码格式,将信息以一种可读的形式展现给我们,而这些信息最终的本质,还是二进制。
下面我使用Linux上的一个指令hexdump
,查看二进制文件;
hexdump -C flash_rdp.bin
这里的工具展示给我们的内容:
左边的是地址;
flash_rdp.bin
文件大小是 11256 个字节;文件大小 这里地址到
0x2bf8
就是11256的十六进制形式;中间是bin文件的十六进制内容形式;
右边则是我们人类可以看懂的文本格式,通常代码中定义的字符串,都可以在这里找到,比如图片中的
dafaultTask
就是我在代码中定义的一个任务的名称;
OK,那bin文件是如何生成的呢?我们下面来继续介绍一下吧。再讲讲elf文件格式。
.elf
elf
是(Executable File Format
)的缩写,顾名思义就是可执行文件格式。这种格式的通用性很强。
可以追溯到coff
文件规范,coff
是Unix系统实验室首先提出并且使用的文件规范,后来,微软基于coff
格式制定了PE
格式标准,并用于当时的Windows系统。
后来,Unix实验室在coff
的基础上重新发布了新的格式,也就是现在使用很广泛的elf
格式,作为应用程序二进制接口 Application Binary Interface
(ABI
)。
由于elf
文件具有通用性强的优点,现在流行的开发模式是:先通过编译工具生成ELF文件格式的可执行文件,在使用外部工具,抽离出elf文件中的相应部分,生成bin文件。
著名的gnu
、bootloader
、U-Boot
就采用了这种做法。例如:
编译器工具集gcc的bin生成工具是elf2bin。 ARM公司虽然使用的是自家的armcc编译器,但是也提供了fromelf工具来实现上面的方式。
使用gcc 编译出来的是ELF文件。
gcc –o test test.c
然后生成的test
文件就是elf
格式的,在linux shell下输入 ./test就可以执行。
还可以通过指令,查看elf的头部;
readelf -h test
上面说了,armcc编译出来的文件显然也是遵守elf格式的,我们也用readelf简单看一下它的头部;
我把.axf
拷贝到虚拟机上,使用readelf看了一下elf header,确实是32位的ARM平台,所以这里的axf文件。
下面我看了一下KEIL MDK安装路径下的armcc
工具链,这里有一个fromelf.exe
通过这个工具,我们可以将axf
文件转换成bin
文件;也就是二进制文件;
使用指令;
fromelf.exe .\flash_rdp.axf --bin --output .\flash_rdp.bin
这样就生成了bin文件,可以通过flash工具,直接烧录bin文件到芯片上,比如使用jlink的flash tool可以直接烧bin文件到芯片的内部flash中。
而axf文件,可以通过icp的方式烧录到芯片中。
到这里,elf和axf文件差不多介绍了一下,但是elf格式内容还是比较多的,可以参考相应的资料;下面简单讲讲.map
文件
.map
在介绍map文件之前,我们先回顾一下程序编译的几个阶段;
预编译阶段:又称为预处理阶段,对代码做一些文本上的替换工作;
编译阶段:源文件
C files
和汇编文件Assembly files
被编译器生成.o
文件;链接阶段:
.o
文件通过链接器armlink
生成 elf格式的文件;
armcc的整个构建过程如下图所示;
其中,map文件就在链接阶段产生,这里我们先打开一个 .map
文件看一下,看看里面都有些什么,如下图所示;
所以map文件就详细地向我们展示了,源代码被工具链构建之后的详细信息,包括固件大小,函数符号,内存映射,等等,这里就不详细介绍;
另外hex
之前写过一篇文件详细介绍过,但是感觉不用太在意。
summary
简单介绍了使用arm工具链在构建过程中所产生的几种文件类型,包括,bin文件,hex文件,axf文件,elf格式,map文件等等,由于作者能力水平有限,文章难免存在错误,请不吝赐教。
如果文章帮助了你,请帮忙三连鼓励。