Revisão | 447f72b8efa34b20e24d609d94ff2adc922a7ae9 (tree) |
---|---|
Hora | 2018-10-27 17:54:43 |
Autor | Evgeniy Didin <evgeniy.didin@syno...> |
Commiter | Waldemar Brodkorb |
ARC: Accommodate TLS fix in Binutils
[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:
#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
The result shoud be:
foo1 = 3
foo3 = 2
Commands to build artefacts:
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
Add path to libtesttls.so file to LD_LIBRARY_PATH before runnig
tst.out application.
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>
CC: Waldemar Brodkorb <wbx@uclibc-ng.org>
@@ -165,7 +165,7 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, | ||
165 | 165 | *reloc_addr = tls_tpnt->l_tls_modid; |
166 | 166 | break; |
167 | 167 | case R_ARC_TLS_DTPOFF: |
168 | - *reloc_addr = symbol_addr; | |
168 | + *reloc_addr += symbol_addr; | |
169 | 169 | break; |
170 | 170 | case R_ARC_TLS_TPOFF: |
171 | 171 | CHECK_STATIC_TLS ((struct link_map *) tls_tpnt); |