summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-09-27 21:33:54 -0700
committerDavid S. Miller <davem@davemloft.net>2012-09-27 21:33:54 -0700
commitaa9bbfe6a79fce593ab3d298bb0e880d77eb7f71 (patch)
treeee985cd26a370995dd7eb89cece24126aea2d939
parentc39bc8b8254364fda301a89180130c3586859d75 (diff)
downloadglibc-aa9bbfe6a79fce593ab3d298bb0e880d77eb7f71.tar.gz
glibc-aa9bbfe6a79fce593ab3d298bb0e880d77eb7f71.tar.xz
glibc-aa9bbfe6a79fce593ab3d298bb0e880d77eb7f71.zip
Fix sparc64 crashes with LD_BIND_NOW and --enable-bind-now.
	[BZ #14376]
	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Do not
	pass reloc->r_addend in as the 'high' argument to
	sparc64_fixup_plt when handling R_SPARC_JMP_IREL relocations.
-rw-r--r--ChangeLog7
-rw-r--r--NEWS4
-rw-r--r--sysdeps/sparc/sparc64/dl-machine.h9
3 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index c55a72e271..5729b4c1ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-09-27  David S. Miller  <davem@davemloft.net>
+
+	[BZ #14376]
+	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Do not
+	pass reloc->r_addend in as the 'high' argument to
+	sparc64_fixup_plt when handling R_SPARC_JMP_IREL relocations.
+
 2012-09-28  Pino Toscano  <toscano.pino@tiscali.it>
 
 	* rt/tst-aio2.c: Include <pthread.h>.
diff --git a/NEWS b/NEWS
index cd0c579ea2..c0a671de21 100644
--- a/NEWS
+++ b/NEWS
@@ -13,8 +13,8 @@ Version 2.17
   13412, 13542, 13629, 13679, 13696, 13717, 13741, 13939, 13966, 14042,
   14090, 14150, 14151, 14154, 14157, 14166, 14173, 14195, 14237, 14252,
   14283, 14298, 14303, 14307, 14328, 14331, 14336, 14337, 14347, 14349,
-  14459, 14476, 14505, 14510, 14516, 14518, 14519, 14530, 14532, 14538,
-  14544, 14545, 14562, 14576, 14579, 14583, 14587, 14621.
+  14376, 14459, 14476, 14505, 14510, 14516, 14518, 14519, 14530, 14532,
+  14538, 14544, 14545, 14562, 14576, 14579, 14583, 14587, 14621.
 
 * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
   Optimized versions of memcpy, memset, and memcmp added for System z10 and
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index 35c24d1558..2f8bbe1786 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -458,7 +458,14 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
       break;
     case R_SPARC_JMP_IREL:
       value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap));
-      /* Fall thru */
+      /* 'high' is always zero, for large PLT entries the linker
+	 emits an R_SPARC_IRELATIVE.  */
+#ifdef RESOLVE_CONFLICT_FIND_MAP
+      sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
+#else
+      sparc64_fixup_plt (map, reloc, reloc_addr, value, 0, 0);
+#endif
+      break;
     case R_SPARC_JMP_SLOT:
 #ifdef RESOLVE_CONFLICT_FIND_MAP
       /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]