From d60e760e8096feac0fff494f9bb1a0538115a905 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 22 Apr 2014 09:45:39 +0200 Subject: 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/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 +++- c/src/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 +++- 9 files changed, 27 insertions(+), 9 deletions(-) (limited to 'c/src/lib/libbsp/sh') diff --git a/c/src/lib/libbsp/sh/gensh1/startup/linkcmds b/c/src/lib/libbsp/sh/gensh1/startup/linkcmds index d0a837ed7a..62e5584a3e 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 3f7b8bb1cc..ab7e31e5d0 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 2260b835b5..c962e8f9a0 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 a0f98019f9..321760aa6f 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 23e62b9e4e..e2e3a993a2 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 ab156f0164..a84b502717 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 1cdc32bd81..30c315e0d4 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 4da05e451d..addeac408e 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 6543fbd8ce..5b0d4d7ff7 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)); -- cgit v1.2.3