Browse Source

or1k: fix some TLS issues

Before this commit tst-tls-at-ctor test would segfault.
After it passes.

testsuite run before: https://pastebin.com/504JgQXa
testsuite run after: https://pastebin.com/d2aNciVt

Stafford Horne already fixed it in glibc:
* https://github.com/openrisc/or1k-glibc/blob/bcd87396ebe78228645c0731b06c934dfd88855a/sysdeps/or1k/dl-machine.h#L298
* https://github.com/openrisc/or1k-glibc/blob/bcd87396ebe78228645c0731b06c934dfd88855a/sysdeps/or1k/dl-machine.h#L99
Yann Sionneau 4 years ago
parent
commit
db4b12ae62
2 changed files with 6 additions and 4 deletions
  1. 4 2
      ldso/ldso/or1k/dl-sysdep.h
  2. 2 2
      ldso/ldso/or1k/elfinterp.c

+ 4 - 2
ldso/ldso/or1k/dl-sysdep.h

@@ -36,8 +36,10 @@ do {									\
 #define ELF_TARGET "or1k"
 #define ELF_TARGET "or1k"
 
 
 #define elf_machine_type_class(type) \
 #define elf_machine_type_class(type) \
-  (((type) == R_OR1K_JMP_SLOT) * ELF_RTYPE_CLASS_PLT \
-   | ((type) == R_OR1K_COPY) * ELF_RTYPE_CLASS_COPY)
+  (((type) == R_OR1K_JMP_SLOT || (type) == R_OR1K_TLS_DTPMOD || \
+    (type) == R_OR1K_TLS_DTPOFF || \
+    (type) == R_OR1K_TLS_TPOFF) * ELF_RTYPE_CLASS_PLT \
+ | ((type) == R_OR1K_COPY) * ELF_RTYPE_CLASS_COPY)
 
 
 static inline Elf32_Addr *
 static inline Elf32_Addr *
 or1k_get_got (void)
 or1k_get_got (void)

+ 2 - 2
ldso/ldso/or1k/elfinterp.c

@@ -249,11 +249,11 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope,
 			*reloc_addr = tls_tpnt->l_tls_modid;
 			*reloc_addr = tls_tpnt->l_tls_modid;
 			break;
 			break;
 		case R_OR1K_TLS_DTPOFF:
 		case R_OR1K_TLS_DTPOFF:
-			*reloc_addr = symbol_addr;
+			*reloc_addr = symbol_addr + rpnt->r_addend;
 			break;
 			break;
 		case R_OR1K_TLS_TPOFF:
 		case R_OR1K_TLS_TPOFF:
 			CHECK_STATIC_TLS ((struct link_map *) tls_tpnt);
 			CHECK_STATIC_TLS ((struct link_map *) tls_tpnt);
-			*reloc_addr = tls_tpnt->l_tls_offset + symbol_addr + rpnt->r_addend;
+			*reloc_addr = tls_tpnt->l_tls_offset + symbol_addr + rpnt->r_addend - TLS_TCB_SIZE;
 			break;
 			break;
 #endif
 #endif