On 10/24/2018 07:11 AM, Evgeniy Didin wrote:
> [1] fixes clash of TLS variables on ARC and since LD now calculates
> relocations
> a bit different now we need to update dynamic loader as well otherwise relocs
> will be calculated improperly.
>
> Note this is an ABI change and should go in-line with corresponding ARC tools.
> That said either arc-2018.09 (to be released in few weeks) or the next
> version of upstream
> Binutils (2.32) are required for normal TLS work on ARC.
>
> Testcase:
> ----------------------------------8<-------------------------------
> #include <stdio.h>
> int foo3(void);
> int foo1(void);
>
> #ifdef _SHARED
> int foo1(){
> static __thread int val3=1;
> val3 += 2;
> return val3;
> }
>
> #elif _SHARED2
> int foo3(){
> static __thread int val2=0;
> val2 += 2;
> return val2;
> }
> #else
> int main(){
> printf("foo1 = %d \n", foo1());
> printf("foo3 = %d \n", foo3());
> return 0;
> }
> #endif
> --------------------------------->8---------------------------------------
>
> The result shoud be:
> ----8<----
> foo1 = 3
> foo3 = 2
> ---->8----
>
> Commands to build artefacts:
> ----------------------------------------8<-------------------------------
> arc-linux-gcc -fPIE -ffunction-sections -fdata-sections -pthread -Os \
> -fPIC -o testtls.o -D_SHARED -c tst.c
> arc-linux-gcc -fPIE -ffunction-sections -fdata-sections -pthread -Os \
> -fPIC -o testtls2.o -D_SHARED2 -c tst.c
> arc-linux-gcc -shared -o libtesttls.so testtls.o testtls2.o -lm -Os
> arc-linux-gcc tst.c -o tst.out -L./ -ltesttls -Os -fPIE
> --------------------------------->8---------------------------------------
>
> Add path to libtesttls.so file to LD_LIBRARY_PATH before runnig
> tst.out application.
>
> [1]
> https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=714e9a954a2e4123dcb26bb8da850e1344de4f5f
>
> Signed-off-by: Alexey Brodkin <[email protected]>
> Signed-off-by: Evgeniy Didin <[email protected]>
> CC: Cupertino Miranda <[email protected]>
> CC: Vineet Gupta <[email protected]>
Acked-by: Vineet Gupta <[email protected]>
> CC: Waldemar Brodkorb <[email protected]>
> ---
> ldso/ldso/arc/elfinterp.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/ldso/ldso/arc/elfinterp.c b/ldso/ldso/arc/elfinterp.c
> index a30c19bcb..61029185f 100644
> --- a/ldso/ldso/arc/elfinterp.c
> +++ b/ldso/ldso/arc/elfinterp.c
> @@ -165,7 +165,7 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct
> r_scope_elem *scope,
> *reloc_addr = tls_tpnt->l_tls_modid;
> break;
> case R_ARC_TLS_DTPOFF:
> - *reloc_addr = symbol_addr;
> + *reloc_addr += symbol_addr;
> break;
> case R_ARC_TLS_TPOFF:
> CHECK_STATIC_TLS ((struct link_map *) tls_tpnt);
_______________________________________________
devel mailing list
[email protected]
https://mailman.uclibc-ng.org/cgi-bin/mailman/listinfo/devel