ZHCU820Y September 2004 – June 2021
.cinit 段中的表由可变大小的初始化记录组成。每个必须自动初始化的变量在 .cinit 段中都有一条记录。图 7-6 显示了 .cinit 段的格式和初始化记录。
初始化记录的字段包含以下信息:
每个必须自动初始化的变量在 .cinit 段中都有一条初始化记录。
以下示例显示了在 C 中定义的初始化全局变量。
int x;
short i = 23;
int *p =
int a[5] = {1,2,3,4,5};
相应的初始化表如下所示。.cinit:c 段包含所有标量数据,是 .cinit 段的子段。该子段在初始化期间作为一条记录处理,从而最大限度地减少了 .cinit 段的整体大小。
.global _x
.bss _x,4,4
.sect ".cinit:c"
.align 8
.field (CIR - $) - 8, 32
.field _I+0,32
.field 23,16 ; _I @ 0
.sect ".text"
.global _I
_I: .usect ".bss:c",2,2
.sect ".cinit:c"
.align 4
.field _x,32 ; _p @ 0
.sect ".text"
.global _p
_p: .usect ".bss:c",4,4
.sect ".cinit"
.align 8
.field IR_1,32
.field _a+0,32
.field 1,32 ; _a[0] @ 0
.field 2,32 ; _a[1] @ 32
.field 3,32 ; _a[2] @ 64
.field 4,32 ; _a[3] @ 96
.field 5,32 ; _a[4] @ 128
IR_1: .set 20
.sect ".text"
.global _a
.bss _a,20,4
;**********************************************************************
;* 标记 CINIT:C 中标量初始化记录的结尾 *
;**********************************************************************
CIR: .sect ".cinit:c"
.cinit 段必须只包含这种格式的初始化表。连接汇编语言模块时,请勿将 .cinit 段用于任何其他目的。
.pinit 段中的表仅包含要调用的构造函数的地址列表(如下图所示)。构造函数显示在表中的 .cinit 初始化后。
当您使用 --rom_model 或 --ram_model 选项时,链接器会组合来自所有 C/C++ 模块的 .cinit 段,并在 .cinit 复合段的末尾附加一个空字。此终止记录显示为字段大小为 0 的记录,并标记初始化表的末尾。
同样,--rom_model 或 --ram_model 链接选项会使链接器组合来自所有 C/C++ 模块的所有 .pinit 段,并在 .pinit 复合段的末尾附加一个空字。启动例程在遇到空构造函数地址时知道全局构造函数表的末尾。
符合 const 条件的变量的初始化方式有所不同;请参阅Topic Link Label6.7.1。