编译器生成称为段 的可重定位代码块和数据块,这些代码块以多种方式分配到内存中,以符合各种系统配置。有关各段及其分配的更多信息,请参阅 节 8中介绍的目标文件信息。有关 C7000 段名称的详细信息,请参阅 C7000 嵌入式应用程序二进制接口 (EABI) 参考指南 (SPRUIG4)。
段有两种基本的类型:
- 未初始化的段会在存储器中保留空间(通常为 RAM)。程序可以在运行时使用此空间来创建和存储变量。编译器会创建以下未初始化的段:
- .bss 段为未初始化的全局变量和静态变量保留空间。这些变量由汇编器分配。
- .common 段为未初始化的全局变量和静态变量保留空间。这些变量由链接器分配。未使用且未初始化的变量通常创建为通用符号(除非指定了 --common=off),以便将该变量从生成的应用中排除。
- .stack 段为系统栈保留空间。
- .sysmem 段为动态存储器分配保留空间。此空间由动态存储器分配例程使用,如 malloc()、calloc()、realloc() 或 new()。如果 C/C++ 程序不使用这些函数,编译器则不会创建 .sysmem 段。
- 初始化段包含数据或可执行代码。初始化段通常是只读的;例外情况如下所示。C/C++ 编译器会创建以下初始化段:
- .args 段包含基于主机的加载程序的命令参数。请参阅 --arg_size 选项。
- .binit 段包含引导时复制表。有关 BINIT 的详细信息,请参阅 节 12.8.4.2。
- 只有在使用 --rom_model 选项时,才会创建 .cinit 段。它包含显式初始化的全局变量和静态变量表。
- .got 段包含全局偏移量表。此段是可写的。
- .init_array 段包含用于调用全局构造函数的表。
- .ovly 段包含联合的复制表,其中的不同段具有相同的运行地址。
- .data 段为初始化的非常量全局变量和静态变量保留空间。此段是可写的。
- .c7xabi.exidx 段包含用于异常处理的索引表。.c7xabi.extab 段包含用于异常处理的堆栈展开指令。请参阅 --exceptions 选项。
- .name.load 段包含段 名称 的压缩映像。有关复制表的信息,请参阅节 12.8。
- .const 段包含字符串文字、浮点常量和使用 C/C++ 限定符 const 定义的数据(前提是该常量未定义为 volatile 或 节 5.5.2 中描述的异常之一)。字符串文字放置在 .const:.string 子段中,以更大力度地控制链接时放置位置。
- .text 段包含所有可执行代码和由编译器生成的常量。此段通常是只读的。
- .TI.crctab 段包含 CRC 检查表。
注: 仅使用程序存储器中的代码除代码段外,已初始化和未初始化的段不能分配到内部程序存储器中。
汇编器会创建默认段 .text、和 .data。您可以指示编译器使用 CODE_SECTION 和 DATA_SECTION pragma 创建其他段(请参阅节 5.8.5和节 5.8.8)。