TLS_LD should use linker-provided symbol _TLS_MODULE_BASE_ instead of symbol it resolves to get thread pointer, otherwise linker relaxation doesn't work correctly, adding extra offset to thread-local variable address.
This fixes most of tls/tst-tls* tests.
Signed-off-by: Max Filippov jcmvbkbc@gmail.com --- test/tls/tls-macros.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/test/tls/tls-macros.h b/test/tls/tls-macros.h index a41aef6..7d89274 100644 --- a/test/tls/tls-macros.h +++ b/test/tls/tls-macros.h @@ -900,9 +900,9 @@ register void *__gp __asm__("$29");
#define TLS_LD(x) \ ({ int *__l; \ - __asm__ ("movi a8, " #x "@TLSFUNC\n\t" \ - "movi a10, " #x "@TLSARG\n\t" \ - "callx8.tls a8, " #x "@TLSCALL\n\t" \ + __asm__ ("movi a8, _TLS_MODULE_BASE_@TLSFUNC\n\t" \ + "movi a10, _TLS_MODULE_BASE_@TLSARG\n\t" \ + "callx8.tls a8, _TLS_MODULE_BASE_@TLSCALL\n\t" \ "movi %0, " #x "@TPOFF\n\t" \ "add %0, %0, a10\n\t" \ : "=r" (__l) \