查看原文
其他

基础很重要!elf和map文件有不同?

小麦大叔 小麦大叔 2022-10-21

点击上方“小麦大叔”,选择“置顶/星标公众号”

福利干货,第一时间送达


大家好,我是小麦,之前有个朋友在群里问到.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文件

著名的gnubootloaderU-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 ——

19岁天才少年纯手工自制CPU,直呼NB


100元都不到的树莓派Zero 2 W正式发布!


嵌入式为什么没有软件架构师?



分享 💬  点赞 👍  在看 ❤️ 

以“三连”行动支持优质内容!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存