基础很重要!elf和map文件有不同?
时间:2021-11-03 14:52:38
手机看文章
扫描二维码
随时随地手机看文章
[导读]点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,之前有个朋友在群里问到.map和.elf文件分别起什么作用?虽然是比较基础的问题,但是一时间我也没有答上来了,于是就简单地整理这方面的问题,下面简单复习一下。事情的起因在做MCU开发的过程中,我...
.map和.elf文件分别起什么作用?虽然是比较基础的问题,但是一时间我也没有答上来了,于是就简单地整理这方面的问题,下面简单复习一下。
事情的起因在做MCU开发的过程中,我们以Keil MDK为例简单介绍一下,通常我们会看到一些后缀的文件名,比如.bin文件,.hex文件,.axf文件,.map文件,.elf文件,当然还有很多其他的文件,这里我们先简单介绍一下,先说.elf吧。
.bin
bin文件就是二进制文件,完全有0和1组成;当然了,所有的文件最终的本质都是0和1,不过这里的bin文件应该面向机器的文件了,机器可以读懂它,而人很难读懂。我们所熟悉的文本文件,是通过多种编码格式,将信息以一种可读的形式展现给我们,而这些信息最终的本质,还是二进制。
下面我使用Linux上的一个指令hexdump,查看二进制文件;
hexdump -C flash_rdp.bin
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
elf header上面说了,armcc编译出来的文件显然也是遵守elf格式的,我们也用readelf简单看一下它的头部;
文件列表我把.axf拷贝到虚拟机上,使用readelf看了一下elf header,确实是32位的ARM平台,所以这里的axf文件。
device下面我看了一下KEIL MDK安装路径下的armcc工具链,这里有一个fromelf.exe通过这个工具,我们可以将axf文件转换成bin文件;也就是二进制文件;
fromelf使用指令;
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文件细节所以map文件就详细地向我们展示了,源代码被工具链构建之后的详细信息,包括固件大小,函数符号,内存映射,等等,这里就不详细介绍;
另外hex之前写过一篇文件详细介绍过,但是感觉不用太在意。
summary
简单介绍了使用arm工具链在构建过程中所产生的几种文件类型,包括,bin文件,hex文件,axf文件,elf格式,map文件等等,由于作者能力水平有限,文章难免存在错误,请不吝赐教。
如果文章帮助了你,请帮忙三连鼓励。
—— The End ——