@@ -210,20 +210,22 @@ SECTIONS
210210 . = ALIGN(4);
211211 /* preinit data */
212212 PROVIDE_HIDDEN (__preinit_array_start = .);
213+ PROVIDE_HIDDEN (__bothinit_array_start = .);
213214 KEEP(*(.preinit_array))
214215 PROVIDE_HIDDEN (__preinit_array_end = .);
215216
216217 . = ALIGN(4);
217218 /* init data */
218219 PROVIDE_HIDDEN (__init_array_start = .);
219- KEEP(*(SORT (.init_array.*)))
220+ KEEP(*(SORT_BY_INIT_PRIORITY (.init_array.*)))
220221 KEEP(*(.init_array))
221222 PROVIDE_HIDDEN (__init_array_end = .);
223+ PROVIDE_HIDDEN (__bothinit_array_end = .);
222224
223225 . = ALIGN(4);
224226 /* finit data */
225227 PROVIDE_HIDDEN (__fini_array_start = .);
226- KEEP(*(SORT (.fini_array.*)))
228+ KEEP(*(SORT_BY_INIT_PRIORITY (.fini_array.*)))
227229 KEEP(*(.fini_array))
228230 PROVIDE_HIDDEN (__fini_array_end = .);
229231
@@ -251,6 +253,10 @@ SECTIONS
251253 LONG (ADDR(.ER_CODE_SRAM))
252254 LONG (SIZEOF(.ER_CODE_SRAM) / 4)
253255#endif
256+ LONG (LOADADDR(.TFM_TDATA))
257+ LONG (ADDR(.TFM_TLS_BASE))
258+ LONG (SIZEOF(.TFM_TDATA) / 4)
259+
254260 __copy_table_end__ = .;
255261
256262 /* .zero.table */
@@ -265,6 +271,10 @@ SECTIONS
265271 LONG (ADDR(.TFM_SP_META_PTR))
266272 LONG (SIZEOF(.TFM_SP_META_PTR) / 4)
267273#endif
274+
275+ LONG (ADDR(.TFM_TLS_BASE) + SIZEOF(.TFM_TDATA))
276+ LONG ((SIZEOF(.TFM_TLS_BASE) - SIZEOF(.TFM_TDATA)) / 4)
277+
268278 __zero_table_end__ = .;
269279
270280 /* Capture all remaining code (except RAM code) in the privileged TF-M
@@ -552,6 +562,10 @@ SECTIONS
552562 . = ALIGN(4);
553563 } > RAM AT > FLASH
554564
565+ PROVIDE(__data_source = LOADADDR(.TFM_DATA));
566+ PROVIDE(__data_start = ADDR(.TFM_DATA));
567+ PROVIDE(__data_size = SIZEOF(.TFM_DATA));
568+
555569 .TFM_BSS ALIGN(4) (NOLOAD) :
556570 {
557571 __bss_start__ = .;
@@ -577,6 +591,31 @@ SECTIONS
577591 . = ALIGN(4);
578592 __bss_end__ = .;
579593 } > RAM
594+
595+ PROVIDE(__bss_start = ADDR(.TFM_BSS));
596+ PROVIDE(__bss_size = SIZEOF(.TFM_BSS));
597+
598+ .TFM_TDATA :
599+ {
600+ PROVIDE( __tls_start_addr = . );
601+ *(.tdata .tdata.* .gnu.linkonce.td.*)
602+ } > RAM
603+
604+ .TFM_TBSS :
605+ {
606+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
607+ *(.tcommon)
608+ PROVIDE( __tls_end_addr = . );
609+ } > RAM
610+
611+ .TFM_TLS_BASE : {
612+ . = . + (__tls_end_addr - __tls_start_addr);
613+ } > RAM
614+ PROVIDE( __tls_base = ADDR(.TFM_TLS_BASE) );
615+ PROVIDE( __tls_align = MAX(ALIGNOF(.TFM_TDATA), ALIGNOF(.TFM_TBSS)) );
616+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
617+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
618+
580619 Image$$ER_PART_RT_POOL$$ZI$$Base = __partition_runtime_start__;
581620 Image$$ER_PART_RT_POOL$$ZI$$Limit = __partition_runtime_end__;
582621 Image$$ER_SERV_RT_POOL$$ZI$$Base = __service_runtime_start__;
0 commit comments