fix powerpc dynamic linker thread-pointer-relative relocations
authorRich Felker <dalias@aerifal.cx>
Tue, 17 Jun 2014 18:32:43 +0000 (14:32 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 17 Jun 2014 18:32:43 +0000 (14:32 -0400)
processing of R_PPC_TPREL32 was ignoring the addend provided by the
RELA-style relocation and instead using the inline value as the
addend. this presumably broke dynamic-linked access to initial TLS in
cases where the addend was nonzero.

arch/powerpc/reloc.h

index d5ba74a723154b55825966d3d992fcde03745f37..1563450d8ba15482fa55e7a2b1a1b3a15b0201d8 100644 (file)
@@ -32,9 +32,9 @@ static inline int do_single_reloc(
                *reloc_addr = def.sym->st_value + addend;
                break;
        case R_PPC_TPREL32:
-               *reloc_addr += def.sym
-                       ? def.sym->st_value + def.dso->tls_offset - 0x7000
-                       : self->tls_offset - 0x7000;
+               *reloc_addr = (def.sym
+                       ? def.sym->st_value + def.dso->tls_offset
+                       : self->tls_offset) - 0x7000 + addend;
                break;
        }
        return 0;