ARM映像文件格式

学习ADS工具编写ARM程序,整理一些关于文件格式的说明。

 

ARM中的各种源文件(包括汇编文件,C语言程序及C++程序等)经过ARM编译器编译后生成ELF格式的目标文件。这些目标文件和相应的C/C++运行时用到的库经过ARM连接器处理后,生成ELF格式的映像文件,这种格式的ELF格式的映像文件是一种可执行文件,可被写入嵌入式设备的ROM中。

利用ADS编译可调试目标时,会生成两种格式的可执行文件:bin文件和axf文件。bin文件是真正的可执行文件,axf是ARM的调试文件,它除了包含bin的内容外,还附加其他的可调试信息,这些调试信息加在可执行的二进制数据的前面,所以把axf文件写到ARM的指令执行地址(一般是0x00)将不能运行。如果在ADS中设置为"Release",则在该目录下的axf里面的内容和bin里面的内容是一样的。

另外,ARM程序运行时包含RO,RW,ZI三部分内容,其中ZI(未初始化变量)是不会包含在映像文件的,因为其中数据都为零,程序运行前会将这部分数据初始化为零。

 

ARM映像文件是一个层次性结构的文件,包括了域(region),输出段(output section)和输入段(input section)。一个映像文件由一个或者多个域组成,每个域最多由三个输出段(RO,RW,IZ)组成,每个输出段又包含一个或者多个输入段,各个输入段包含了目标文件中的代码和数据。

域(region):一个映像文件由一个或多个域组成。是组成映象文件的最大结构。所谓域指的就是整个bin映像文件所在的区域,又分为加载域和运行域。加载域就是映像文件被静态存放的工作区域,一般来说flash里的整个bin文件所处在的地址空间就是加载域,当然程序一般不会放在flash里执行(程序也可以在nor flash里直接运行),一般会搬到sdram里运行工作,他们被搬到sdram里工作所处的地址空间就是运行域。一个域通常映射到一个物理存储器上,如ROM和RAM等。

段(section):一个域中包含一个或多个输出段,一个输出段包含一个或多个输入段。我们输入的代码,一般有代码和数据部分,这就是所谓的输入段,每个输入段有相应的属性,可以为只读(ro),可读写(rw)以及初始化为0的(zi)。

RO RW ZI:输入段包含四类内容:代码,初始化数据,未经初始化的存储区域,初始化的存储区域。每个输入段都有相应的属性,ARM连接器根据各输入段的属性将这些输入段分组,再组成对应属性的输出段。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。在运行域中这些输出段并不连续,但rw和zi一定是连着的。

C中的指令以及常量被编译后RO类型数据

C中的未被初始化或者初始化为0的变量为ZI类型数据

C中的已被初始化成非0值的变量编译后是RW类型数据

加载时地址:映象文件位于存储器时的地址

运行时地址:映象文件运行时的地址

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值