Re: [uclibc-ng-devel] [PATCH] ARC: Accommodate TLS fix in Binutils

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=714e9a95...
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Signed-off-by: Evgeniy Didin <didin@synopsys.com> CC: Cupertino Miranda <cmiranda@synopsys.com> CC: Vineet Gupta <vgupta@synopsys.com>
Acked-by: Vineet Gupta <vgupta@synopsys.com>
CC: Waldemar Brodkorb <wbx@uclibc-ng.org> --- 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);
participants (1)
-
Vineet Gupta