https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113081
--- Comment #3 from Iain Buclaw <ibuclaw at gdcproject dot org> --- (In reply to Iain Buclaw from comment #2) > If I recall correctly, this trick is not guaranteed to work (for a > drtbegin.o and drtend.o object), as there really no control over where in > the TLS section these variables will land. > > ``` > #ifdef DRT_BEGIN > _Thread_local __SIZE_TYPE__ __tls_start = 3; > #endif > > #ifdef DRT_END > _Thread_local __SIZE_TYPE__ __tls_end; > #endif > ``` Both of these rely on the default linker script of: .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } to group the sections in that order. According to some old commit notes of mine for gdc in 2013, ld can reorder .tdata after .tdata.*, despite what the linker script says.