小麦大叔
认证:普通会员
所在专题目录 查看专题
STM8内部EEPROM的使用详解
Keil 编译太慢怎么办?教你一招,提速10倍
Keil切换到armclang编译器,到底强在哪里?
单片机打印彩色的log,这招秀翻了同事
STM32有这么难学吗?这些工具可以帮大忙
keil开发过程中map和elf文件有什么作用?
作者动态 更多
凉了!嵌入式真的要卷成下一个Java了吗?
02-28 09:03
嵌入式开发必须学习Qt吗?
02-27 09:16
这么简单的环境搭建,网友:我却搭了很久,结果还是不行...
02-26 15:44
单片机如何能运行如飞?一种高效实现数学函数的方式!
2022-01-26 11:08
keil开发过程中map和elf文件有什么作用?
2021-11-01 19:05

keil开发过程中map和elf文件有什么作用?

大家好,我是小麦,之前有个朋友在群里问到.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文件等等,由于作者能力水平有限,文章难免存在错误,请不吝赐教。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 4
关注 132
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧