当尝试使用 TI Clang v1.3.0-beta.1为 MSP430E301Y 创建一个 C++示例时、程序无法到达 main、当尝试写入闪存时、_TI_decompress_lzss ()函数遇到硬故障。
问题是 .init_array 段已由链接器放置在读取/写入段中。 如链接器映射文件所示:
SEGMENT ALLOCATION MAP run origin load origin length init length attrs members ---------- ----------- ---------- ----------- ----- ------- 00000000 00000000 0002d44b 0002d44b r-x 00000000 00000000 00000208 00000208 r-- .intvecs 00000208 00000208 0002a9c2 0002a9c2 r-x .text 0002abd0 0002abd0 0000287b 0000287b r-- .rodata 0002d44c 0002d44c 00000008 00000000 rw- 0002d44c 0002d44c 00000008 00000000 rw- .init_array LINKER GENERATED COPY TABLES __TI_cinit_table @ 0002d4f8 records: 3, size/record: 8, table size: 24 .data: load addr=0002d458, load size=0000007b bytes, run addr=20031000, run size=00000e45 bytes, compression=lzss .init_array: load addr=0002d4d3, load size=0000000d bytes, run addr=0002d44c, run size=00000008 bytes, compression=lzss .bss: load addr=0002d4f0, load size=00000008 bytes, run addr=20031e48, run size=00000478 bytes, compression=zero_init
链接器命令文件将.init_array 段放置在闪存(ROM)中、这与 3.1中给出的示例相匹配。 《tiarmclang 入门指南》的源文件:
.init_array : > FLASH
随附了该示例。
如果 TI ARM v20.2.5编译器使用相同的示例、则链接器创建的.init_array 段为只读段、因此可以放置在闪存中。
TI ARM Clang v1.3.0链接器将.init_array 段创建为只读/写而不是只读、这是否是一个错误?