可执行与可链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。
主要可以分为三种类型:
(1)可重定位的文件(Relocatable File):它包含基础代码和数据,但代码及数据都没有指定绝对地址,适合于与其他目标文件链接来创建可执行文件或者共享目标文件。一般由编译器根据源代码生成,如MDK的armcc和armasm生成的*.o文件,Linux的*.o 文件,Windows的 *.obj文件。
(2)可执行文件(Executable File):它内部组织的代码数据都有固定的地址(或相对基地址的偏移),系统可根据这些地址信息把程序加载到内存执行。一般由连接器根据可重定位文件链接而成,如MDK中gcc编译链接生成的*.elf文件,armlink生成的*.axf文件(*.axf在*.elf基础上增加了调试使用的信息),Linux的/bin/bash文件,Windows的*.exe文件。
(3)共享目标文件(Shared Object File):MDK生成的*.lib文件,Linux的*.so文件,Windows的DLL文件。
ELF文件格式
ELF文件包含ELF文件头(ELF header)、程序头(Program header)、节区(Section)以及节区头部表(Section header table)。
ELF文件头:用来描述整个文件的组织,例如数据的大小端格式,程序头、节区头在文件中的位置等。
程序头:告诉系统如何加载程序,例如程序主体存储在本文件的哪个位置,程序的大小,程序要加载到内存什么地址等等。
节区:*.o文件的独立数据区域,它包含提供给链接视图使用的大量信息,如指令(Code)、数据(RO、RW、ZI-data)、 符号表(函数、变量名等)、重定位信息等。
节区头部表:包含了本文件节区的信息,如节区名称、大小等等。
编译常见重要文件
*.o、.elf、.axf、.bin及.hex文件都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。
.o文件、.elf文件和.axf文件
* .o文件是可重定位的对象文件(目标文件),*.axf文件是由ARMCC编译生成的可执行对象文件,可用于调试,不可重定位,*.elf文件是由GCC编译生成的文件,功能与axf文件一样。
*.o文件由相应的源文件编译而成,是独立的文件,而*.axf由多个.o文件链接而成,是整个工程汇总的文件,包含了所有调用到*.o文件节区的内容。
*.o文件中不含有程序头,且没有分配节区地址,而*.axf中除了具有*.o文件中节区头描述的节区类型、 文件位置偏移、大小之外,还包括具体的地址描述。
.hex文件和.bin文件
在MDK中使用下载器(DAP/JLINK/ULINK等)下载程序或仿真的时候,MDK调用*.axf文件然后控制下载器把代码内容下载到STM32芯片对应的存储空间,复位芯片开始执行代码。然而脱离了MDK或IAR等工具,下载器就无法直接使用*.axf文件下载代码,因此需要hex和bin格式的代码数据文件。
bin文件是纯二进制数据,无特殊格式。它是最直接的代码映像,记录的内容就是要存储到FLASH的二进制数据,没有任何辅助信息。
hex文件是Intel公司制定的一种使用ASCII文本记录机器码或常量数据的文件格式, 这种文件常常用十六进制符号来记录将要存储到ROM中的数据,绝大多数下载器支持该格式。它的基本格式组成如下:
组成 |
解释 |
: |
表示记录的开头 |
II |
1个字节,表示主体数据区长度 |
aaaa |
2个字节,表示该记录内容在FLASH中存放的起始地址 |
tt |
1个字节,表示该记录类型(00:数据记录;01:本文件结束记录;02:扩地址记录;04:扩展线性地址记录,后面的记录按该地址递增;05:表示一个线性地址记录的起始,只适用于ARM) |
dd... |
表示以字节为单位的多个数据 |
cc文章来源:https://www.toymoban.com/news/detail-414268.html |
表示本条记录的校验和,它是前面所有16进制数据 (以字节为单位)的和对256取模运算的结果的补码文章来源地址https://www.toymoban.com/news/detail-414268.html |
到了这里,关于ELF文件格式以及重要文件(.o,.elf,.axf,.bin,.hex)说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!