arrfab / rpms / glibc

Forked from rpms/glibc 4 years ago
Clone

Blame SOURCES/glibc-ppc64le-36.patch

147e83
# commit 7ec07d9a7b501f1b7d740fda02ba5f39d6d684e5
147e83
# Author: Alan Modra <amodra@gmail.com>
147e83
# Date:   Wed Dec 4 06:44:06 2013 -0600
147e83
# 
147e83
#     PowerPC64: Report overflow on @h and @ha relocations
147e83
#     
147e83
#     This patch updates glibc in accordance with the binutils patch checked in here:
147e83
#     https://sourceware.org/ml/binutils/2013-10/msg00372.html
147e83
#     
147e83
#     This changes the various R_PPC64_..._HI and _HA relocations to report
147e83
#     32-bit overflows.  The motivation is that existing uses of @h / @ha
147e83
#     are to build up 32-bit offsets (for the "medium model" TOC access
147e83
#     that GCC now defaults to), and we'd really like to see failures at
147e83
#     link / load time rather than silent truncations.
147e83
#     
147e83
#     For those rare cases where a modifier is needed to build up a 64-bit
147e83
#     constant, new relocations _HIGH / _HIGHA are supported.
147e83
#     
147e83
#     The patch also fixes a bug in overflow checking for the R_PPC64_ADDR30
147e83
#     and R_PPC64_ADDR32 relocations.
147e83
# 
147e83
diff -urN glibc-2.17-c758a686/elf/elf.h glibc-2.17-c758a686/elf/elf.h
147e83
--- glibc-2.17-c758a686/elf/elf.h	2014-05-29 13:17:35.000000000 -0500
147e83
+++ glibc-2.17-c758a686/elf/elf.h	2014-05-29 13:17:35.000000000 -0500
147e83
@@ -2243,6 +2243,17 @@
147e83
 #define R_PPC64_DTPREL16_HIGHERA 104 /* half16	(sym+add)@dtprel@highera */
147e83
 #define R_PPC64_DTPREL16_HIGHEST 105 /* half16	(sym+add)@dtprel@highest */
147e83
 #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16	(sym+add)@dtprel@highesta */
147e83
+#define R_PPC64_TLSGD		107 /* none	(sym+add)@tlsgd */
147e83
+#define R_PPC64_TLSLD		108 /* none	(sym+add)@tlsld */
147e83
+#define R_PPC64_TOCSAVE		109 /* none */
147e83
+
147e83
+/* Added when HA and HI relocs were changed to report overflows.  */
147e83
+#define R_PPC64_ADDR16_HIGH	110
147e83
+#define R_PPC64_ADDR16_HIGHA	111
147e83
+#define R_PPC64_TPREL16_HIGH	112
147e83
+#define R_PPC64_TPREL16_HIGHA	113
147e83
+#define R_PPC64_DTPREL16_HIGH	114
147e83
+#define R_PPC64_DTPREL16_HIGHA	115
147e83
 
147e83
 /* GNU extension to support local ifunc.  */
147e83
 #define R_PPC64_JMP_IREL	247
147e83
diff -urN glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h
147e83
--- glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h	2014-05-29 13:17:34.000000000 -0500
147e83
+++ glibc-2.17-c758a686/sysdeps/powerpc/powerpc64/dl-machine.h	2014-05-29 13:17:35.000000000 -0500
147e83
@@ -663,11 +663,25 @@
147e83
 
147e83
     case R_PPC64_TPREL16_HI:
147e83
       value = elf_machine_tprel (map, sym_map, sym, reloc);
147e83
+      if (dont_expect (value + 0x80000000 >= 0x100000000LL))
147e83
+	_dl_reloc_overflow (map, "R_PPC64_TPREL16_HI", reloc_addr, refsym);
147e83
+      *(Elf64_Half *) reloc_addr = PPC_HI (value);
147e83
+      break;
147e83
+
147e83
+    case R_PPC64_TPREL16_HIGH:
147e83
+      value = elf_machine_tprel (map, sym_map, sym, reloc);
147e83
       *(Elf64_Half *) reloc_addr = PPC_HI (value);
147e83
       break;
147e83
 
147e83
     case R_PPC64_TPREL16_HA:
147e83
       value = elf_machine_tprel (map, sym_map, sym, reloc);
147e83
+      if (dont_expect (value + 0x80008000 >= 0x100000000LL))
147e83
+	_dl_reloc_overflow (map, "R_PPC64_TPREL16_HA", reloc_addr, refsym);
147e83
+      *(Elf64_Half *) reloc_addr = PPC_HA (value);
147e83
+      break;
147e83
+
147e83
+    case R_PPC64_TPREL16_HIGHA:
147e83
+      value = elf_machine_tprel (map, sym_map, sym, reloc);
147e83
       *(Elf64_Half *) reloc_addr = PPC_HA (value);
147e83
       break;
147e83
 
147e83
@@ -703,17 +717,23 @@
147e83
       break;
147e83
 
147e83
     case R_PPC64_ADDR16_HI:
147e83
+      if (dont_expect (value + 0x80000000 >= 0x100000000LL))
147e83
+	_dl_reloc_overflow (map, "R_PPC64_ADDR16_HI", reloc_addr, refsym);
147e83
+    case R_PPC64_ADDR16_HIGH:
147e83
       *(Elf64_Half *) reloc_addr = PPC_HI (value);
147e83
       break;
147e83
 
147e83
     case R_PPC64_ADDR16_HA:
147e83
+      if (dont_expect (value + 0x80008000 >= 0x100000000LL))
147e83
+	_dl_reloc_overflow (map, "R_PPC64_ADDR16_HA", reloc_addr, refsym);
147e83
+    case R_PPC64_ADDR16_HIGHA:
147e83
       *(Elf64_Half *) reloc_addr = PPC_HA (value);
147e83
       break;
147e83
 
147e83
     case R_PPC64_ADDR30:
147e83
       {
147e83
 	Elf64_Addr delta = value - (Elf64_Xword) reloc_addr;
147e83
-	if (dont_expect ((delta + 0x80000000) >= 0x10000000
147e83
+	if (dont_expect ((delta + 0x80000000) >= 0x100000000LL
147e83
 			 || (delta & 3) != 0))
147e83
 	  _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym);
147e83
 	BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc);
147e83
@@ -762,7 +782,7 @@
147e83
       return;
147e83
 
147e83
     case R_PPC64_ADDR32:
147e83
-      if (dont_expect ((value + 0x80000000) >= 0x10000000))
147e83
+      if (dont_expect ((value + 0x80000000) >= 0x100000000LL))
147e83
 	_dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym);
147e83
       *(Elf64_Word *) reloc_addr = value;
147e83
       return;