当前位置:首页 > 公众号精选 > 小麦大叔
[导读]点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,之前有个朋友在群里问到.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 ——



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭