[rtems commit] bsps: Fix TLS support in linker command files

Sebastian Huber sebh at rtems.org
Tue Apr 22 07:44:38 UTC 2014


Module:    rtems
Branch:    master
Commit:    d60e760e8096feac0fff494f9bb1a0538115a905
Changeset: http://git.rtems.org/rtems/commit/?id=d60e760e8096feac0fff494f9bb1a0538115a905

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Apr 22 09:45:39 2014 +0200

bsps: Fix TLS support in linker command files

The TLS section symbols had wrong values in case of an empty TLS data
section and a nonempty TLS BSS section.

---

 c/src/lib/libbsp/arm/gba/startup/linkcmds          |    4 +++-
 c/src/lib/libbsp/arm/shared/startup/linkcmds.base  |    4 +++-
 c/src/lib/libbsp/avr/avrtest/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/bfin/TLL6527M/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/bfin/bf537Stamp/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/bfin/eZKit533/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/h8300/h8sim/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/i386/pc386/startup/linkcmds       |    4 +++-
 c/src/lib/libbsp/lm32/lm32_evr/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/lm32/milkymist/startup/linkcmds   |    4 +++-
 c/src/lib/libbsp/m32c/m32cbsp/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m32r/m32rsim/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m68k/av5282/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/m68k/av5282/startup/linkcmdsflash |    4 +++-
 c/src/lib/libbsp/m68k/av5282/startup/linkcmdsram   |    4 +++-
 c/src/lib/libbsp/m68k/csb360/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/m68k/gen68302/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/gen68340/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/gen68360/startup/linkcmds    |    4 +++-
 .../libbsp/m68k/gen68360/startup/linkcmds.bootp    |    4 +++-
 .../lib/libbsp/m68k/gen68360/startup/linkcmds.prom |    4 +++-
 c/src/lib/libbsp/m68k/idp/startup/linkcmds         |    4 +++-
 .../lib/libbsp/m68k/mcf5206elite/startup/linkcmds  |    4 +++-
 .../m68k/mcf5206elite/startup/linkcmds.flash       |    4 +++-
 c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/mcf5225x/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/mcf5235/startup/linkcmds     |    4 +++-
 .../lib/libbsp/m68k/mcf5235/startup/linkcmdsflash  |    4 +++-
 c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsram  |    4 +++-
 c/src/lib/libbsp/m68k/mcf5329/startup/linkcmds     |    4 +++-
 .../lib/libbsp/m68k/mcf5329/startup/linkcmdsflash  |    4 +++-
 c/src/lib/libbsp/m68k/mrm332/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/m68k/mvme136/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m68k/mvme147/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/mvme162/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m68k/mvme167/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/m68k/ods68302/startup/debugger    |    4 +++-
 c/src/lib/libbsp/m68k/ods68302/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/ods68302/startup/rom         |    4 +++-
 c/src/lib/libbsp/m68k/shared/startup/linkcmds.base |    4 +++-
 c/src/lib/libbsp/m68k/sim68000/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/m68k/uC5282/startup/linkcmds      |    4 +++-
 c/src/lib/libbsp/mips/csb350/startup/linkcmds      |    4 +++-
 .../lib/libbsp/mips/genmongoosev/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/mips/hurricane/startup/linkcmds   |    4 +++-
 c/src/lib/libbsp/mips/jmr3904/startup/linkcmds     |    4 +++-
 c/src/lib/libbsp/mips/malta/startup/linkcmds       |    4 +++-
 c/src/lib/libbsp/mips/rbtx4925/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/mips/rbtx4938/startup/linkcmds    |    4 +++-
 c/src/lib/libbsp/moxie/moxiesim/startup/linkcmds   |    4 +++-
 c/src/lib/libbsp/nios2/nios2_iss/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/powerpc/ep1a/startup/linkcmds     |    4 +++-
 .../libbsp/powerpc/gen5200/startup/linkcmds.base   |    4 +++-
 .../lib/libbsp/powerpc/haleakala/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/powerpc/mbx8xx/startup/linkcmds   |    4 +++-
 .../lib/libbsp/powerpc/mpc8260ads/startup/linkcmds |    4 +++-
 c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds  |    4 +++-
 .../lib/libbsp/powerpc/score603e/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/powerpc/shared/startup/linkcmds   |    4 +++-
 .../libbsp/powerpc/shared/startup/linkcmds.base    |    4 +++-
 c/src/lib/libbsp/powerpc/ss555/startup/linkcmds    |    4 +++-
 .../libbsp/powerpc/tqm8xx/startup/linkcmds.base    |    4 +++-
 c/src/lib/libbsp/powerpc/virtex4/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/powerpc/virtex5/startup/linkcmds  |    4 +++-
 c/src/lib/libbsp/sh/gensh1/startup/linkcmds        |    4 +++-
 c/src/lib/libbsp/sh/gensh2/startup/linkcmds        |    4 +++-
 c/src/lib/libbsp/sh/gensh2/startup/linkcmds.ram    |    4 +++-
 c/src/lib/libbsp/sh/gensh2/startup/linkcmds.rom    |    4 +++-
 c/src/lib/libbsp/sh/gensh4/startup/linkcmds        |    4 +++-
 c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom    |    4 +++-
 .../lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram  |    4 +++-
 c/src/lib/libbsp/sh/shsim/startup/linkcmds         |    4 +++-
 c/src/lib/libbsp/sh/shsim/startup/linkcmds.sim     |    4 +++-
 .../lib/libbsp/sparc/shared/startup/linkcmds.base  |    4 +++-
 c/src/lib/libbsp/sparc64/shared/startup/linkcmds   |    4 +++-
 c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds  |    4 +++-
 doc/cpu_supplement/general.t                       |    4 +++-
 79 files changed, 237 insertions(+), 79 deletions(-)

diff --git a/c/src/lib/libbsp/arm/gba/startup/linkcmds b/c/src/lib/libbsp/arm/gba/startup/linkcmds
index 8713953..174964a 100644
--- a/c/src/lib/libbsp/arm/gba/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/gba/startup/linkcmds
@@ -150,9 +150,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   __rodata_end = . ;
 
   .eh_frame :
diff --git a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
index fbbcdad..04f3308 100644
--- a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
@@ -132,9 +132,11 @@ SECTIONS {
 		_TLS_BSS_end = .;
 	} > REGION_RODATA AT > REGION_RODATA_LOAD
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 	.preinit_array : ALIGN_WITH_INPUT {
 		PROVIDE_HIDDEN (__preinit_array_start = .);
 		KEEP (*(.preinit_array))
diff --git a/c/src/lib/libbsp/avr/avrtest/startup/linkcmds b/c/src/lib/libbsp/avr/avrtest/startup/linkcmds
index c78562a..7ba1587 100644
--- a/c/src/lib/libbsp/avr/avrtest/startup/linkcmds
+++ b/c/src/lib/libbsp/avr/avrtest/startup/linkcmds
@@ -163,9 +163,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }  > data
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .data	  :
   {
     *(.data)
diff --git a/c/src/lib/libbsp/bfin/TLL6527M/startup/linkcmds b/c/src/lib/libbsp/bfin/TLL6527M/startup/linkcmds
index a8c5375..7e37798 100644
--- a/c/src/lib/libbsp/bfin/TLL6527M/startup/linkcmds
+++ b/c/src/lib/libbsp/bfin/TLL6527M/startup/linkcmds
@@ -79,9 +79,11 @@ SECTIONS
     } > sdram
 
     __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+    __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+    __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
     __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
     __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-    __TLS_Alignment = ALIGNOF (.tdata);
+    __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
     
     .fini :
     {
diff --git a/c/src/lib/libbsp/bfin/bf537Stamp/startup/linkcmds b/c/src/lib/libbsp/bfin/bf537Stamp/startup/linkcmds
index 9d2366d..7c1e5e4 100644
--- a/c/src/lib/libbsp/bfin/bf537Stamp/startup/linkcmds
+++ b/c/src/lib/libbsp/bfin/bf537Stamp/startup/linkcmds
@@ -87,9 +87,11 @@ SECTIONS
     } > sdram
 
     __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+    __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+    __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
     __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
     __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-    __TLS_Alignment = ALIGNOF (.tdata);
+    __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
     
     .fini :
     {
diff --git a/c/src/lib/libbsp/bfin/eZKit533/startup/linkcmds b/c/src/lib/libbsp/bfin/eZKit533/startup/linkcmds
index 02fa04e..a8f39fb 100644
--- a/c/src/lib/libbsp/bfin/eZKit533/startup/linkcmds
+++ b/c/src/lib/libbsp/bfin/eZKit533/startup/linkcmds
@@ -76,9 +76,11 @@ SECTIONS
     } > sdram
 
     __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+    __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+    __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
     __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
     __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-    __TLS_Alignment = ALIGNOF (.tdata);
+    __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
     
     .fini :
     {
diff --git a/c/src/lib/libbsp/h8300/h8sim/startup/linkcmds b/c/src/lib/libbsp/h8300/h8sim/startup/linkcmds
index bf0ad6f..c951557 100644
--- a/c/src/lib/libbsp/h8300/h8sim/startup/linkcmds
+++ b/c/src/lib/libbsp/h8300/h8sim/startup/linkcmds
@@ -70,9 +70,11 @@ SECTIONS
         __TLS_BSS_end = .;
     }  >ram
     __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+    __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+    __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
     __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
     __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-    __TLS_Alignment = ALIGNOF (.tdata);
+    __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
    .tors SIZEOF(.tbss) + ADDR(.tbss): {
         ___ctors = . ;
         *(.ctors)
diff --git a/c/src/lib/libbsp/i386/pc386/startup/linkcmds b/c/src/lib/libbsp/i386/pc386/startup/linkcmds
index c59d4f5..bb82922 100644
--- a/c/src/lib/libbsp/i386/pc386/startup/linkcmds
+++ b/c/src/lib/libbsp/i386/pc386/startup/linkcmds
@@ -108,9 +108,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .eh_frame_hdr : { *(.eh_frame_hdr) }
   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
diff --git a/c/src/lib/libbsp/lm32/lm32_evr/startup/linkcmds b/c/src/lib/libbsp/lm32/lm32_evr/startup/linkcmds
index a1db0f2..e9c0009 100644
--- a/c/src/lib/libbsp/lm32/lm32_evr/startup/linkcmds
+++ b/c/src/lib/libbsp/lm32/lm32_evr/startup/linkcmds
@@ -90,9 +90,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } > sdram
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
diff --git a/c/src/lib/libbsp/lm32/milkymist/startup/linkcmds b/c/src/lib/libbsp/lm32/milkymist/startup/linkcmds
index 31c6c9b..d774e66 100644
--- a/c/src/lib/libbsp/lm32/milkymist/startup/linkcmds
+++ b/c/src/lib/libbsp/lm32/milkymist/startup/linkcmds
@@ -89,9 +89,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } > sdram
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
diff --git a/c/src/lib/libbsp/m32c/m32cbsp/startup/linkcmds b/c/src/lib/libbsp/m32c/m32cbsp/startup/linkcmds
index 4fbf54f..f3721ad 100644
--- a/c/src/lib/libbsp/m32c/m32cbsp/startup/linkcmds
+++ b/c/src/lib/libbsp/m32c/m32cbsp/startup/linkcmds
@@ -72,9 +72,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > RAM
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .data : {
     . = ALIGN(32 / 8);
diff --git a/c/src/lib/libbsp/m32r/m32rsim/startup/linkcmds b/c/src/lib/libbsp/m32r/m32rsim/startup/linkcmds
index adde91c..bca3946 100644
--- a/c/src/lib/libbsp/m32r/m32rsim/startup/linkcmds
+++ b/c/src/lib/libbsp/m32r/m32rsim/startup/linkcmds
@@ -91,9 +91,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .sdata2         :
   {
     *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
diff --git a/c/src/lib/libbsp/m68k/av5282/startup/linkcmds b/c/src/lib/libbsp/m68k/av5282/startup/linkcmds
index 363958b..c72601d 100644
--- a/c/src/lib/libbsp/m68k/av5282/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/av5282/startup/linkcmds
@@ -147,9 +147,11 @@ SECTIONS
     } >ram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data : {
             PROVIDE( _data_dest_start = . );
diff --git a/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsflash b/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsflash
index ada8ec2..3d361df 100644
--- a/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsflash
+++ b/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsflash
@@ -146,9 +146,11 @@ SECTIONS
     } >flash
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data 0x1000 : AT ( ADDR(.tdata) + SIZEOF ( .tdata ) )
 	{
diff --git a/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsram b/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsram
index e6501b3..4c11cc7 100644
--- a/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsram
+++ b/c/src/lib/libbsp/m68k/av5282/startup/linkcmdsram
@@ -146,9 +146,11 @@ SECTIONS
     } >ram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data : {
             PROVIDE( _data_dest_start = . );
diff --git a/c/src/lib/libbsp/m68k/csb360/startup/linkcmds b/c/src/lib/libbsp/m68k/csb360/startup/linkcmds
index 1ec50d7..9b1c2d5 100644
--- a/c/src/lib/libbsp/m68k/csb360/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/csb360/startup/linkcmds
@@ -115,9 +115,11 @@ SECTIONS
    } >ram
 
    _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+   _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+   _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
    _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
    _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-   _TLS_Alignment = ALIGNOF (.tdata);
+   _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
 
    .data :
diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds
index eb76d9f..d831f7a 100644
--- a/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds
@@ -128,9 +128,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/gen68340/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68340/startup/linkcmds
index 0a9d764..bde2809 100644
--- a/c/src/lib/libbsp/m68k/gen68340/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/gen68340/startup/linkcmds
@@ -156,9 +156,11 @@ SECTIONS {
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds
index 6b86db2..7957b04 100644
--- a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds
@@ -120,9 +120,11 @@ SECTIONS {
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 _copy_start = .;
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp
index 0c1e710..d14ed8f 100644
--- a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp
@@ -125,9 +125,11 @@ SECTIONS {
 	} >rom
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : AT(SIZEOF(.text)) {
                 _copy_start = .;
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom
index a360a3a..22637bf 100644
--- a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom
@@ -124,9 +124,11 @@ SECTIONS {
 	} >rom
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : AT(SIZEOF(.text)) {
                 _copy_start = .;
diff --git a/c/src/lib/libbsp/m68k/idp/startup/linkcmds b/c/src/lib/libbsp/m68k/idp/startup/linkcmds
index eaaf200..a8efe63 100644
--- a/c/src/lib/libbsp/m68k/idp/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/idp/startup/linkcmds
@@ -125,9 +125,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds
index 5d4f39e..d7ceb20 100644
--- a/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds
@@ -150,9 +150,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    .data BLOCK (0x4) : {
            copy_start = .;
diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds.flash b/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds.flash
index 48a9c4b..12db0e2 100644
--- a/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds.flash
+++ b/c/src/lib/libbsp/m68k/mcf5206elite/startup/linkcmds.flash
@@ -150,9 +150,11 @@ SECTIONS
   } >rom
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    .data 0x30000400 : AT(LOADADDR(.text) + SIZEOF(.text)) {
            copy_start = .;
diff --git a/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds
index bc4d87f..e10a57f 100644
--- a/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds
@@ -134,9 +134,11 @@ SECTIONS
     } >flash
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     .data 0x20000400 : AT (_estuff)
     {
diff --git a/c/src/lib/libbsp/m68k/mcf5225x/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf5225x/startup/linkcmds
index af3603b..b0a48b7 100644
--- a/c/src/lib/libbsp/m68k/mcf5225x/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mcf5225x/startup/linkcmds
@@ -134,9 +134,11 @@ SECTIONS
     } >flash
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     .data 0x20000400 : AT (_estuff)
     {
diff --git a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmds
index d068135..e4e752d 100644
--- a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmds
@@ -154,9 +154,11 @@ SECTIONS
     } > dram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data : {
             PROVIDE( _data_dest_start = . );
diff --git a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsflash b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsflash
index 6e5efe1..8082860 100644
--- a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsflash
+++ b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsflash
@@ -158,9 +158,11 @@ SECTIONS
     } >flash
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data 0x4000 : AT ( ADDR(.tdata) + SIZEOF ( .tdata ) )
 	{
diff --git a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsram b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsram
index dd4f4cc..d960364 100644
--- a/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsram
+++ b/c/src/lib/libbsp/m68k/mcf5235/startup/linkcmdsram
@@ -154,9 +154,11 @@ SECTIONS
     } >ram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
         
         .data : {
             PROVIDE( _data_dest_start = . );
diff --git a/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmds
index 3c44fae..b5a228e 100644
--- a/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmds
@@ -145,9 +145,11 @@ SECTIONS
     } > dram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     .data :
     {
diff --git a/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmdsflash b/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmdsflash
index ee97da4..30f4687 100644
--- a/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmdsflash
+++ b/c/src/lib/libbsp/m68k/mcf5329/startup/linkcmdsflash
@@ -141,9 +141,11 @@ SECTIONS
     } > boot_flash
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     .data 0x40000500 : AT (_estuff)
     {
diff --git a/c/src/lib/libbsp/m68k/mrm332/startup/linkcmds b/c/src/lib/libbsp/m68k/mrm332/startup/linkcmds
index 378559c..aeed9a3 100644
--- a/c/src/lib/libbsp/m68k/mrm332/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mrm332/startup/linkcmds
@@ -155,9 +155,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } > rom
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .gcc_exc :
   AT ( ADDR(.tdata) + SIZEOF( .tdata ) )
   {
diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds
index 7f8208a..ad4cba6 100644
--- a/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds
@@ -125,9 +125,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
index 21de6f0..bc75072 100644
--- a/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
@@ -129,9 +129,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds
index 1986348..e8ac4c5 100644
--- a/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds
@@ -129,9 +129,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds
index 8e9bf40..10a5c1d 100644
--- a/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds
@@ -132,9 +132,11 @@ SECTIONS
 	} >ram
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data : {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/mvme167/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme167/startup/linkcmds
index 2a0c797..d585bf9 100644
--- a/c/src/lib/libbsp/m68k/mvme167/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/mvme167/startup/linkcmds
@@ -139,9 +139,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   
   .data : {
     PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/ods68302/startup/debugger b/c/src/lib/libbsp/m68k/ods68302/startup/debugger
index f1653e5..8d156bd 100644
--- a/c/src/lib/libbsp/m68k/ods68302/startup/debugger
+++ b/c/src/lib/libbsp/m68k/ods68302/startup/debugger
@@ -34,9 +34,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .vtable (ADDR(.text) + SIZEOF(.text))  :
   {
diff --git a/c/src/lib/libbsp/m68k/ods68302/startup/linkcmds b/c/src/lib/libbsp/m68k/ods68302/startup/linkcmds
index e5664d8..c153825 100644
--- a/c/src/lib/libbsp/m68k/ods68302/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/ods68302/startup/linkcmds
@@ -141,9 +141,11 @@ SECTIONS
 	} >rom
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
 
         .data (ADDR(.vtable) + SIZEOF(.vtable)) : 
diff --git a/c/src/lib/libbsp/m68k/ods68302/startup/rom b/c/src/lib/libbsp/m68k/ods68302/startup/rom
index ef2c527..352ae6a 100644
--- a/c/src/lib/libbsp/m68k/ods68302/startup/rom
+++ b/c/src/lib/libbsp/m68k/ods68302/startup/rom
@@ -34,9 +34,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   
   .vtable 0 :
   {
diff --git a/c/src/lib/libbsp/m68k/shared/startup/linkcmds.base b/c/src/lib/libbsp/m68k/shared/startup/linkcmds.base
index 27a1980..02bc269 100644
--- a/c/src/lib/libbsp/m68k/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/m68k/shared/startup/linkcmds.base
@@ -67,9 +67,11 @@ SECTIONS {
 		_TLS_BSS_end = .;
 	} > REGION_TEXT AT > REGION_TEXT_LOAD
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 	.preinit_array : ALIGN_WITH_INPUT {
 		PROVIDE_HIDDEN (__preinit_array_start = .);
 		KEEP (*(.preinit_array))
diff --git a/c/src/lib/libbsp/m68k/sim68000/startup/linkcmds b/c/src/lib/libbsp/m68k/sim68000/startup/linkcmds
index 9744f50..9a326b3 100644
--- a/c/src/lib/libbsp/m68k/sim68000/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/sim68000/startup/linkcmds
@@ -122,9 +122,11 @@ SECTIONS
 	}
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
         .data 0x80000 : AT (ADDR(.tdata) + SIZEOF (.tdata)) {
                 PROVIDE (_copy_start = .);
diff --git a/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds b/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
index 109bc15..dbf9081 100644
--- a/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
@@ -162,9 +162,11 @@ SECTIONS
     } > ram
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     .data : {
         PROVIDE( _data_dest_start = . );
diff --git a/c/src/lib/libbsp/mips/csb350/startup/linkcmds b/c/src/lib/libbsp/mips/csb350/startup/linkcmds
index ceda3e2..47234fe 100644
--- a/c/src/lib/libbsp/mips/csb350/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/csb350/startup/linkcmds
@@ -127,9 +127,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .data : 
   {
diff --git a/c/src/lib/libbsp/mips/genmongoosev/startup/linkcmds b/c/src/lib/libbsp/mips/genmongoosev/startup/linkcmds
index f095069..c0da8b7 100644
--- a/c/src/lib/libbsp/mips/genmongoosev/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/genmongoosev/startup/linkcmds
@@ -124,9 +124,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .data : 
   {
diff --git a/c/src/lib/libbsp/mips/hurricane/startup/linkcmds b/c/src/lib/libbsp/mips/hurricane/startup/linkcmds
index 0962039..f261248 100644
--- a/c/src/lib/libbsp/mips/hurricane/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/hurricane/startup/linkcmds
@@ -113,9 +113,11 @@ SECTIONS
   }
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    _fdata = ALIGN(16);
 
diff --git a/c/src/lib/libbsp/mips/jmr3904/startup/linkcmds b/c/src/lib/libbsp/mips/jmr3904/startup/linkcmds
index 9d98018..1ef3d80 100644
--- a/c/src/lib/libbsp/mips/jmr3904/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/jmr3904/startup/linkcmds
@@ -109,9 +109,11 @@ SECTIONS
   }
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    _fdata = ALIGN(16);
 
diff --git a/c/src/lib/libbsp/mips/malta/startup/linkcmds b/c/src/lib/libbsp/mips/malta/startup/linkcmds
index 8be52ef..c939869 100644
--- a/c/src/lib/libbsp/mips/malta/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/malta/startup/linkcmds
@@ -109,9 +109,11 @@ SECTIONS
   }
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    _fdata = ALIGN(16);
 
diff --git a/c/src/lib/libbsp/mips/rbtx4925/startup/linkcmds b/c/src/lib/libbsp/mips/rbtx4925/startup/linkcmds
index 6c15b7e..3c08ce4 100644
--- a/c/src/lib/libbsp/mips/rbtx4925/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/rbtx4925/startup/linkcmds
@@ -113,9 +113,11 @@ SECTIONS
   }
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    _fdata = ALIGN(16);
 
diff --git a/c/src/lib/libbsp/mips/rbtx4938/startup/linkcmds b/c/src/lib/libbsp/mips/rbtx4938/startup/linkcmds
index 488f9f7..af99da5 100644
--- a/c/src/lib/libbsp/mips/rbtx4938/startup/linkcmds
+++ b/c/src/lib/libbsp/mips/rbtx4938/startup/linkcmds
@@ -113,9 +113,11 @@ SECTIONS
   }
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
    _fdata = ALIGN(16);
 
diff --git a/c/src/lib/libbsp/moxie/moxiesim/startup/linkcmds b/c/src/lib/libbsp/moxie/moxiesim/startup/linkcmds
index 00e2871..15be77d 100644
--- a/c/src/lib/libbsp/moxie/moxiesim/startup/linkcmds
+++ b/c/src/lib/libbsp/moxie/moxiesim/startup/linkcmds
@@ -143,9 +143,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .eh_frame_hdr : { *(.eh_frame_hdr) }
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
diff --git a/c/src/lib/libbsp/nios2/nios2_iss/startup/linkcmds b/c/src/lib/libbsp/nios2/nios2_iss/startup/linkcmds
index 55c04b4..74e5485 100644
--- a/c/src/lib/libbsp/nios2/nios2_iss/startup/linkcmds
+++ b/c/src/lib/libbsp/nios2/nios2_iss/startup/linkcmds
@@ -212,9 +212,11 @@ SECTIONS
     } > onchip_memory_0
 
     _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+    _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+    _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
     _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
     _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-    _TLS_Alignment = ALIGNOF (.tdata);
+    _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
     PROVIDE (__flash_rodata_start = LOADADDR(.rodata));
 
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds b/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds
index 7afd734..ae3fe06 100644
--- a/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds
@@ -106,9 +106,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } >CODE
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .sdata2         : { PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2) *(.gnu.linkonce.s2.*)  }	> CODE
   .sbss2          : { 
     				PROVIDE (__sbss2_start = .);
diff --git a/c/src/lib/libbsp/powerpc/ep1a/startup/linkcmds b/c/src/lib/libbsp/powerpc/ep1a/startup/linkcmds
index 0f4d247..775374c 100644
--- a/c/src/lib/libbsp/powerpc/ep1a/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/ep1a/startup/linkcmds
@@ -75,9 +75,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .eh_frame	  : { *(.eh_frame) }
   _etext = .;
   PROVIDE (etext = .);
diff --git a/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.base b/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.base
index 0cb5692..4c186ef 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.base
+++ b/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.base
@@ -132,9 +132,11 @@ SECTIONS {
 		_TLS_BSS_end = .;
 	} > RAM
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
 	.sdata2 : {
 		PROVIDE (_SDA2_BASE_ = 32768);
diff --git a/c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds b/c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds
index 3c7942e..fc8f68e 100644
--- a/c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds
@@ -154,9 +154,11 @@ SECTIONS
   } >RAM
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .jcr : { KEEP (*(.jcr)) } >RAM
 
diff --git a/c/src/lib/libbsp/powerpc/mbx8xx/startup/linkcmds b/c/src/lib/libbsp/powerpc/mbx8xx/startup/linkcmds
index 9307a9e..45332bc 100644
--- a/c/src/lib/libbsp/powerpc/mbx8xx/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/mbx8xx/startup/linkcmds
@@ -152,9 +152,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
  
   .rel.dyn        :
     {
diff --git a/c/src/lib/libbsp/powerpc/mpc8260ads/startup/linkcmds b/c/src/lib/libbsp/powerpc/mpc8260ads/startup/linkcmds
index a23418a..fc14155 100644
--- a/c/src/lib/libbsp/powerpc/mpc8260ads/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/mpc8260ads/startup/linkcmds
@@ -153,9 +153,11 @@ SECTIONS
   } >ram
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
 
   .rel.dyn        :
diff --git a/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds b/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds
index 079d3fc..4af6976 100644
--- a/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds
@@ -87,9 +87,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } >ROM =0
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   .rodata :
   {
diff --git a/c/src/lib/libbsp/powerpc/score603e/startup/linkcmds b/c/src/lib/libbsp/powerpc/score603e/startup/linkcmds
index 69e67e3..46b5e38 100644
--- a/c/src/lib/libbsp/powerpc/score603e/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/score603e/startup/linkcmds
@@ -114,9 +114,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } >RAM
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .eh_frame	  : { *(.eh_frame)		} >RAM
   _etext = .;
   PROVIDE (_etext = .);
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/linkcmds b/c/src/lib/libbsp/powerpc/shared/startup/linkcmds
index 5ebc5e9..34969e1 100644
--- a/c/src/lib/libbsp/powerpc/shared/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/shared/startup/linkcmds
@@ -93,9 +93,11 @@ SECTIONS
   } >CODE
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/linkcmds.base b/c/src/lib/libbsp/powerpc/shared/startup/linkcmds.base
index 0d97f43..8d85dbf 100644
--- a/c/src/lib/libbsp/powerpc/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/powerpc/shared/startup/linkcmds.base
@@ -119,9 +119,11 @@ SECTIONS {
 		_TLS_BSS_end = .;
 	} > REGION_RODATA AT > REGION_RODATA_LOAD
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 	.preinit_array : ALIGN_WITH_INPUT {
 		PROVIDE_HIDDEN (__preinit_array_start = .);
 		KEEP (*(.preinit_array))
diff --git a/c/src/lib/libbsp/powerpc/ss555/startup/linkcmds b/c/src/lib/libbsp/powerpc/ss555/startup/linkcmds
index 4a01c8d..809b9a3 100644
--- a/c/src/lib/libbsp/powerpc/ss555/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/ss555/startup/linkcmds
@@ -152,9 +152,11 @@ SECTIONS
     _TLS_BSS_end = .;
   }
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /*
    * If debugging, stack the read/write sections directly after the text
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/startup/linkcmds.base b/c/src/lib/libbsp/powerpc/tqm8xx/startup/linkcmds.base
index ba6c1ea..979989f 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/startup/linkcmds.base
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/startup/linkcmds.base
@@ -126,9 +126,11 @@ SECTIONS {
 	} > RAM
 
 	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = ALIGNOF (.tdata);
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
 	.sdata2 : {
 		PROVIDE (_SDA2_BASE_ = 32768);
diff --git a/c/src/lib/libbsp/powerpc/virtex4/startup/linkcmds b/c/src/lib/libbsp/powerpc/virtex4/startup/linkcmds
index 00311c9..55b8f88 100644
--- a/c/src/lib/libbsp/powerpc/virtex4/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/virtex4/startup/linkcmds
@@ -107,9 +107,11 @@ SECTIONS
   } >RAM
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /* Initialised small data addressed as offsets from r2 */
   .sdata2         : { PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)          } > RAM
diff --git a/c/src/lib/libbsp/powerpc/virtex5/startup/linkcmds b/c/src/lib/libbsp/powerpc/virtex5/startup/linkcmds
index 247bee2..63d187c 100644
--- a/c/src/lib/libbsp/powerpc/virtex5/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/virtex5/startup/linkcmds
@@ -107,9 +107,11 @@ SECTIONS
   } >RAM
 
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 
   /* Initialised small data addressed as offsets from r2 */
   .sdata2         : { PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)          } > RAM
diff --git a/c/src/lib/libbsp/sh/gensh1/startup/linkcmds b/c/src/lib/libbsp/sh/gensh1/startup/linkcmds
index d0a837e..62e5584 100644
--- a/c/src/lib/libbsp/sh/gensh1/startup/linkcmds
+++ b/c/src/lib/libbsp/sh/gensh1/startup/linkcmds
@@ -142,9 +142,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds
index 3f7b8bb..ab7e31e 100644
--- a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds
+++ b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds
@@ -153,9 +153,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.ram b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.ram
index 2260b83..c962e8f 100644
--- a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.ram
+++ b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.ram
@@ -152,9 +152,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.rom b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.rom
index a0f9801..321760a 100644
--- a/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.rom
+++ b/c/src/lib/libbsp/sh/gensh2/startup/linkcmds.rom
@@ -153,9 +153,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds
index 23e62b9..e2e3a99 100644
--- a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds
+++ b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds
@@ -104,9 +104,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .ctors   : 
   {
     ___ctors = .;
diff --git a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom
index ab156f0..a84b502 100644
--- a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom
+++ b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom
@@ -116,9 +116,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > rom
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .ctors   : 
   {
     ___ctors = .;
diff --git a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram
index 1cdc32b..30c315e 100644
--- a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram
+++ b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram
@@ -103,9 +103,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .ctors   :  AT(LOADADDR(.rodata) + SIZEOF(.rodata))
   {
     ___ctors = .;
diff --git a/c/src/lib/libbsp/sh/shsim/startup/linkcmds b/c/src/lib/libbsp/sh/shsim/startup/linkcmds
index 4da05e4..addeac4 100644
--- a/c/src/lib/libbsp/sh/shsim/startup/linkcmds
+++ b/c/src/lib/libbsp/sh/shsim/startup/linkcmds
@@ -140,9 +140,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sh/shsim/startup/linkcmds.sim b/c/src/lib/libbsp/sh/shsim/startup/linkcmds.sim
index 6543fbd..5b0d4d7 100644
--- a/c/src/lib/libbsp/sh/shsim/startup/linkcmds.sim
+++ b/c/src/lib/libbsp/sh/shsim/startup/linkcmds.sim
@@ -134,9 +134,11 @@ SECTIONS
     __TLS_BSS_end = .;
   } > ram
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN(128) + (. & (128 - 1));
diff --git a/c/src/lib/libbsp/sparc/shared/startup/linkcmds.base b/c/src/lib/libbsp/sparc/shared/startup/linkcmds.base
index add1f00..c09e1c6 100644
--- a/c/src/lib/libbsp/sparc/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/sparc/shared/startup/linkcmds.base
@@ -117,9 +117,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } > ram
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .rtemsroset : {
     /* for pre rtems-libbsd FreeBSD code */
     __start_set_sysctl_set = .;
diff --git a/c/src/lib/libbsp/sparc64/shared/startup/linkcmds b/c/src/lib/libbsp/sparc64/shared/startup/linkcmds
index 661ad2e..95c8913 100644
--- a/c/src/lib/libbsp/sparc64/shared/startup/linkcmds
+++ b/c/src/lib/libbsp/sparc64/shared/startup/linkcmds
@@ -160,9 +160,11 @@ SECTIONS
     _TLS_BSS_end = .;
   } > ram
   _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+  _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+  _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
   _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
   _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-  _TLS_Alignment = ALIGNOF (.tdata);
+  _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   
   .data	  : AT (ADDR (.tbss) + SIZEOF (.tbss))
   {
diff --git a/c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds b/c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds
index 331ffca..fe0f22b 100644
--- a/c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds
+++ b/c/src/lib/libbsp/v850/gdbv850sim/startup/linkcmds
@@ -102,9 +102,11 @@ SECTIONS
     __TLS_BSS_end = .;
   }
   __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin;
+  __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin;
+  __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin;
   __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin;
   __TLS_Size = __TLS_BSS_end - __TLS_Data_begin;
-  __TLS_Alignment = ALIGNOF (.tdata);
+  __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
   .data		:
   {
     *(.data)
diff --git a/doc/cpu_supplement/general.t b/doc/cpu_supplement/general.t
index 173f84f..3d84c2a 100644
--- a/doc/cpu_supplement/general.t
+++ b/doc/cpu_supplement/general.t
@@ -355,9 +355,11 @@ in its linker command file:
   _TLS_BSS_end = .;
 @}
 _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
 _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
 _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-_TLS_Alignment = ALIGNOF (.tdata);
+_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
 @end example
 
 @section CPU counter




More information about the vc mailing list