浏览代码

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.

(cherry picked from commit 94cf991bf4b18bb87a15a96e7b5e7d92fab787ba)
Rich Felker 10 年之前
父节点
当前提交
f70401eae5
共有 1 个文件被更改,包括 3 次插入3 次删除
  1. 3 3
      arch/powerpc/reloc.h

+ 3 - 3
arch/powerpc/reloc.h

@@ -32,9 +32,9 @@ static inline void 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;
 	}
 }