编译器产生被称为段 的可重定位代码块和数据块。这些段以各种方式分配到内存中,以符合各种系统配置。有关各段及其分配的更多信息,请参阅《MSP430 汇编语言工具用户指南》介绍的目标文件信息。。
有两种基本类型的段:
- 初始化段中包含数据或可执行代码。初始化段通常是只读的;例外情况如下所示。C/C++ 编译器会创建以下初始化段:
- .binit 段包含引导时复制表。有关 BINIT 的详细信息,请参阅《MSP430 汇编语言工具用户指南》。
- .cinit 段包含用于初始化变量和常量的表。编译器不创建此段;相反,链接器会创建此段。
- .init_array 段包含指向全局 C++ 对象初始化例程的指针的表。
- .ovly 段包含联合的复制表,其中的不同段具有相同的运行地址。
- .data 段包含初始化的全局变量和静态变量。此段是可写的。
- 仅对于 EABI,.mspabi.exidx 段包含用于异常处理的索引表。.mspabi.extab 段包含用于异常处理的展开指令。相关详细信息,请参阅 --exceptions 选项。
- .const 段包含字符串常量、字符串文字、开关表和使用 C/C++ 限定符 const 定义的数据(前提是该常量未定义为 volatile 或 Topic Link Label6.7.1 中描述的异常之一)。字符串文字放置在 .const:.string 子段中,以实现更大力度的链接时放置控制。
- .text 段包含所有可执行代码和由编译器生成的常量。此段通常是只读的。
- .TI.crctab 段包含 CRC 检查表。
- 未初始化的段会在存储器中保留空间(通常为 RAM)。程序可以在运行时使用此空间来创建和存储变量。编译器会创建以下未初始化的段:
- .bss 段为全局变量和静态变量保留空间。在引导或加载时,C/C++ 引导例程或加载程序从 .cinit 段(可能在 ROM 中)复制数据,并将其存储在 .bss 段中。
- 仅对于 EABI,.bss 段为未初始化的全局变量和静态变量保留空间。未初始化且也未使用的变量通常创建为公共符号(除非您指定 --common=off),而不是放置在 .bss 中,以便将它们从生成的应用中排除。
- .stack 段为保留空间。C/C++ 软件栈。
- .sysmem 段为动态存储器分配保留空间。此空间由动态存储器分配例程使用,如 malloc()、calloc()、realloc() 或 new()。如果 C/C++ 程序不使用这些函数,编译器不会创建 .sysmem 段。
汇编器会创建默认段 .text、.bss和 .data。您可以指示编译器使用 CODE_SECTION 和 DATA_SECTION pragma 创建其他段(请参阅Topic Link Label6.11.5和Topic Link Label6.11.7)。
链接器从不同的目标文件中获取各个段,并合并具有相同名称的段。表 7-1中列出了生成的输出段,以及每个段在存储器中的适当位置。您可以根据需要将这些输出段放置在地址空间中的任何位置,以满足系统要求。
表 6-1 段和存储器位置摘要
段 |
存储器类型 |
段 |
存储器类型 |
.bss |
RAM |
.pinit 或 .init_array |
ROM 或 RAM |
.cinit |
ROM 或 RAM |
.stack |
RAM |
.const |
ROM 或 RAM |
.sysmem |
RAM |
.data |
RAM |
.text |
ROM 或 RAM |
可以使用链接器命令文件中的 SECTIONS 指令来自定义段分配过程。有关将段分配到存储器中的更多信息,请参阅《MSP430 汇编语言工具用户指南》中的链接器说明一章。