]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix TLS relocations against local symbols on powerpc32, sparc32 and sparc64
authorJames Clarke <jrtc27@jrtc27.com>
Fri, 13 Oct 2017 18:44:39 +0000 (15:44 -0300)
committerAurelien Jarno <aurelien@aurel32.net>
Tue, 14 Nov 2017 20:20:11 +0000 (21:20 +0100)
Normally, TLS relocations against local symbols are optimised by the linker
to be absolute.  However, gold does not do this, and so it is possible to
end up with, for example, R_SPARC_TLS_DTPMOD64 referring to a local symbol.
Since sym_map is left as null in elf_machine_rela for the special local
symbol case, the relocation handling thinks it has nothing to do, and so
the module gets left as 0.  Havoc then ensues when the variable in question
is accessed.

Before this fix, the main_local_gold program would receive a SIGBUS on
sparc64, and SIGSEGV on powerpc32.  With this fix applied, that test now
passes like the rest of them.

* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela):
Assign sym_map to be map for local symbols, as TLS relocations
use sym_map to determine whether the symbol is defined and to
extract the TLS information.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Likewise.

ChangeLog
sysdeps/powerpc/powerpc32/dl-machine.h
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/sparc/sparc64/dl-machine.h

index 01fbb7cd773e2930dfa44a523aa2e7557920ca5a..687fd20c460b5ef298793207c3e21e9d80c2e16b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-10-13  James Clarke  <jrtc27@jrtc27.com>
+
+       * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela):
+       Assign sym_map to be map for local symbols, as TLS relocations
+       use sym_map to determine whether the symbol is defined and to
+       extract the TLS information.
+       * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Likewise.
+       * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Likewise.
+
 2017-10-19  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #22322]
index 28eb50f92db778583c37100c171a7e97d9337b4c..9b5a99fcc7fe8a8043d19d76f2cb56b696ebfce1 100644 (file)
@@ -309,7 +309,10 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
      against local symbols.  */
   if (__builtin_expect (ELF32_ST_BIND (sym->st_info) == STB_LOCAL, 0)
       && sym->st_shndx != SHN_UNDEF)
-    value = map->l_addr;
+    {
+      sym_map = map;
+      value = map->l_addr;
+    }
   else
     {
       sym_map = RESOLVE_MAP (&sym, version, r_type);
index cf7272f359e65eaf8c55188dd5c256b943d91cf9..3e03fd091c7e87e3e1df97983b405048339e7ff5 100644 (file)
@@ -375,6 +375,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
   if (__builtin_expect (ELF32_ST_BIND (sym->st_info) == STB_LOCAL, 0)
       && sym->st_shndx != SHN_UNDEF)
     {
+      sym_map = map;
       value = map->l_addr;
     }
   else
index 99c00f493d8fda4f06fe73f99d1ea547754de3aa..0694ac1362e838d24dfa6aca05fa7639d85b5724 100644 (file)
@@ -402,6 +402,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
   if (__builtin_expect (ELF64_ST_BIND (sym->st_info) == STB_LOCAL, 0)
       && sym->st_shndx != SHN_UNDEF)
     {
+      sym_map = map;
       value = map->l_addr;
     }
   else