summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-06-17 14:32:43 -0400
committerRich Felker <dalias@aerifal.cx>2014-06-17 14:32:43 -0400
commit94cf991bf4b18bb87a15a96e7b5e7d92fab787ba (patch)
treeb3ed632b4751959c4a12d5350f2aaaaa2f0ad6e6
parentf4cc27601817f6decd773c24496bfbe892bcd244 (diff)
downloadmusl-94cf991bf4b18bb87a15a96e7b5e7d92fab787ba.tar.gz
musl-94cf991bf4b18bb87a15a96e7b5e7d92fab787ba.tar.bz2
musl-94cf991bf4b18bb87a15a96e7b5e7d92fab787ba.tar.xz
musl-94cf991bf4b18bb87a15a96e7b5e7d92fab787ba.zip
fix powerpc dynamic linker thread-pointer-relative relocations
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.
-rw-r--r--arch/powerpc/reloc.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/powerpc/reloc.h b/arch/powerpc/reloc.h
index d5ba74a7..1563450d 100644
--- a/arch/powerpc/reloc.h
+++ b/arch/powerpc/reloc.h
@@ -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;