背景介绍
我们在使用IAR EWARM开发环境是经常会使用的各种程序存放的段和块。
IAR生成工具使用的ELF段和块
段 |
说明 |
|
.bss |
存放零初始化的静态和全局变量。 |
|
CSTACK |
存放C或C++程序使用的堆栈。 |
|
.data |
存放静态和全局初始化变量。 |
|
.data_init |
当使用链接器指令初始化时,存放.data段的初始值。 |
|
.exc.text |
存放与异常相关的代码。 |
|
HEAP |
存放用于动态分配数据的堆。 |
|
__iar_tls.$$DATA |
存放TLS变量的初始值。 |
|
.iar.dynexit |
存放退出时调用的表。 |
|
.init_array |
存放一张动态初始化函数表。 |
|
.intvec |
存放复位向量表。 |
|
IRQ_STACK |
存放中断请求,IRQ和异常的堆栈。 |
|
存放用__no_init指示的静态和全局变量。 |
||
.preinit_array |
存放一张动态预初始化函数表。 |
|
.prepreinit_array |
存放一预处理动态预初始化函数表。 |
|
.rodata |
存放常量数据。 |
|
.text |
存放程序代码。 |
.textrw |
存放以__ramfunc声明的程序代码。 |
.textrw_init |
存放以.textrw声明部分的初始化程序。 |
Veneer$$CMSE |
存放安全网关虚表。 |
除了用于您的应用程序的ELF部分之外,这些工具还出于多种目的使用许多其他ELF段:
● 以.debug开头的段通常包含DWARF格式的调试信息。
● 以.iar.debug开头的段包含IAR格式的补充调试信息
● 以.comment开头的段包含用于构建文件的工具和命令行
● 以.rel或.rela开头的段包含ELF重定位信息
● 以.symtab开头的段包含文件的符号表
● 以.strtab开头的段包含符号表中符号的名称
● 以.shstrtab开头的段包含各段的名称。
段和块的详细说明
.bss
CSTACK
存储器放置:该块可以放置在存储器中的任何位置。
.data
描述:存放静态和全局初始化变量。 在目标文件中,这包括初始值。 当使用链接器指令初始化时,将为每个.data段创建一个对应的.data_init段,其中存放可能已压缩的初始值。
存储器放置:此段可以放置在存储器中的任何位置。
.data_init
描述:存放.data段的可能压缩的初始值。 如果使用链接器初始化指令,则此部分由链接器创建。
存储器放置:此段可以放置在存储器中的任何位置。
.exc.text
描述:存放仅在您的应用程序处理异常时,才执行的代码。
存储器放置:与.text在同一存储器中。
HEAP
描述:存放用于在内存中动态分配数据的堆,换句话说,由在C语言中malloc和free分配的数据,在C++语言中new和delete分配的数据。
__iar_tls.$$DATA
描述:存放TLS变量的初始值。 如果使用链接器选项--threaded_lib,则此段由链接器创建。
存储器放置:此段可以放置在存储器中的任何位置。
.iar.dynexit
描述:存放退出时调用的表。
.init_array
描述:存放指向例程的指针,用于初始化带有静态存储持续时间的一个或多个C++对象。
存储器放置:此段可以放置在存储器中的任何位置。
.intvec
描述:保存复位向量表和异常向量,其中包含指向cstartup的分支指令、中断服务例程等。
存储器放置:本段的存放位置取决于设备。 请参阅制造商的硬件手册。
IRQ_STACK
描述:存放为IRQ异常提供服务时使用的堆栈。 可以根据需要添加其他堆栈来服务其它异常类型:FIQ,SVC,ABT和UND。 为了初始化使用的异常堆栈指针,必须修改cstartup.s文件。注意:Cortex-M类处理器编译时,不使用此部分。
存储器放置:此段可以放置在存储器中的任何位置。
.noinit
描述:存放用__no_init指示的静态和全局变量。
存储器放置:此段可以放置在存储器中的任何位置。
.preinit_array
描述:类似于.init_array,但库使用它来使某些C++初始化先于其它初始化。
存储器放置:此段可以放置在存储器中的任何位置。
.prepreinit_array
描述:类似于.init_array,但是它是在C静态初始化重写为动态初始化时使用。 在所有C++动态初始化之前执行。
存储器放置:此段可以放置在存储器中的任何位置。
.rodata
描述:存放常量数据。 这可以包括常量变量,字符串和聚合文字等。
存储器放置:此段可以放置在存储器中的任何位置。
.text
描述:存放程序代码,包括用于系统初始化的代码。
存储器放置:此段可以放置在存储器中的任何位置。
.textrw
描述:存放以ramfunc声明的程序代码。
存储器放置:此段可以放置在存储器中的任何位置。
.textrw_init
描述:存放.textrw声明的段的初始化程序。
存储器放置:此段可以放置在存储器中的任何位置。
Veneer$$CMSE
描述:本段包含链接器为每个入口函数自动创建的安全网关虚表,由扩展关键字__cmse_nonsecure_entry确定。
存储器放置:此部分应放在NSC(非安全可调用)存储区域中。 可以使用SAU(安全属性单元)或IDAU(实现定义的属性单元)对NSC区域进行编程。 有关如何对SAU或IDAU进行编程的信息,请参阅Armv8-M内核的文档。
附录
本文译自IAR EWARM_DevelopmentGuide.ENU.pdf手册。