[binutils] Fix up handling of hidden ifunc relocs on i?86

Jakub Jelinek jakub at fedoraproject.org
Fri Mar 16 15:38:03 UTC 2012


commit 45f57ff34157b59220839f7deaaaba4fb17844e4
Author: Jakub Jelinek <jakub at redhat.com>
Date:   Fri Mar 16 16:37:59 2012 +0100

    Fix up handling of hidden ifunc relocs on i?86

 binutils-2.22.52.0.1-hidden-ifunc.patch |  141 +++++++++++++++++++++++++++++++
 binutils.spec                           |    8 ++-
 2 files changed, 148 insertions(+), 1 deletions(-)
---
diff --git a/binutils-2.22.52.0.1-hidden-ifunc.patch b/binutils-2.22.52.0.1-hidden-ifunc.patch
new file mode 100644
index 0000000..df9f104
--- /dev/null
+++ b/binutils-2.22.52.0.1-hidden-ifunc.patch
@@ -0,0 +1,141 @@
+2012-03-09  H.J. Lu  <hongjiu.lu at intel.com>
+
+	PR ld/13817
+	* bfd/elf32-i386.c (elf_i386_relocate_section): Restore
+	R_386_IRELATIVE.
+
+	* * elf64-x86-64.c (elf_x86_64_relocate_section): Restore
+	R_X86_64_IRELATIVE.
+
+	* ld-i386/pr13302.d: Updated.
+	* ld-x86-64/pr13082-5b.d: Likewise.
+	* ld-x86-64/pr13082-6a.d: Likewise.
+	* ld-x86-64/pr13082-6b.d: Likewise.
+
+--- bfd/elf32-i386.c	21 Oct 2011 19:37:14 -0000	1.265
++++ bfd/elf32-i386.c	9 Mar 2012 16:28:36 -0000	1.266
+@@ -3257,7 +3257,6 @@ elf_i386_relocate_section (bfd *output_b
+ 		  bfd_byte *loc;
+ 		  asection *sreloc;
+ 		  bfd_vma offset;
+-		  bfd_boolean relocate;
+ 
+ 		  /* Need a dynamic relocation to get the real function
+ 		     adddress.  */
+@@ -3278,14 +3277,15 @@ elf_i386_relocate_section (bfd *output_b
+ 		      || info->executable)
+ 		    {
+ 		      /* This symbol is resolved locally.  */
+-		      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
+-		      relocate = TRUE;
++		      outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
++		      bfd_put_32 (output_bfd,
++				  (h->root.u.def.value
++				   + h->root.u.def.section->output_section->vma
++				   + h->root.u.def.section->output_offset),
++				  contents + offset);
+ 		    }
+ 		  else
+-		    {
+-		      outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+-		      relocate = FALSE;
+-		    }
++		    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+ 
+ 		  sreloc = htab->elf.irelifunc;
+ 		  loc = sreloc->contents;
+@@ -3298,8 +3298,7 @@ elf_i386_relocate_section (bfd *output_b
+ 		     we need to include the symbol value so that it
+ 		     becomes an addend for the dynamic reloc.  For an
+ 		     internal symbol, we have updated addend.  */
+-		  if (! relocate)
+-		    continue;
++		  continue;
+ 		}
+ 	      /* FALLTHROUGH */
+ 	    case R_386_PC32:
+--- bfd/elf64-x86-64.c	6 Mar 2012 20:15:56 -0000	1.248
++++ bfd/elf64-x86-64.c	9 Mar 2012 16:28:36 -0000	1.249
+@@ -3156,7 +3156,6 @@ elf_x86_64_relocate_section (bfd *output
+ 		{
+ 		  Elf_Internal_Rela outrel;
+ 		  asection *sreloc;
+-		  bfd_boolean relocate;
+ 
+ 		  /* Need a dynamic relocation to get the real function
+ 		     address.  */
+@@ -3176,15 +3175,15 @@ elf_x86_64_relocate_section (bfd *output
+ 		      || info->executable)
+ 		    {
+ 		      /* This symbol is resolved locally.  */
+-		      outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
+-		      outrel.r_addend = relocation;
+-		      relocate = TRUE;
++		      outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
++		      outrel.r_addend = (h->root.u.def.value
++					 + h->root.u.def.section->output_section->vma
++					 + h->root.u.def.section->output_offset);
+ 		    }
+ 		  else
+ 		    {
+ 		      outrel.r_info = htab->r_info (h->dynindx, r_type);
+ 		      outrel.r_addend = 0;
+-		      relocate = FALSE;
+ 		    }
+ 
+ 		  sreloc = htab->elf.irelifunc;
+@@ -3195,8 +3194,7 @@ elf_x86_64_relocate_section (bfd *output
+ 		     we need to include the symbol value so that it
+ 		     becomes an addend for the dynamic reloc.  For an
+ 		     internal symbol, we have updated addend.  */
+-		  if (! relocate)
+-		    continue;
++		  continue;
+ 		}
+ 	      /* FALLTHROUGH */
+ 	    case R_X86_64_PC32:
+
+--- ld/testsuite/ld-i386/pr13302.d	21 Oct 2011 19:37:15 -0000	1.1
++++ ld/testsuite/ld-i386/pr13302.d	9 Mar 2012 16:28:37 -0000	1.2
+@@ -5,7 +5,7 @@
+ 
+ Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name
+-[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
++[0-9a-f]+ +[0-9a-f]+ +R_386_IRELATIVE +
+ 
+ Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name
+--- ld/testsuite/ld-x86-64/pr13082-5b.d	21 Oct 2011 19:37:15 -0000	1.2
++++ ld/testsuite/ld-x86-64/pr13082-5b.d	9 Mar 2012 16:28:38 -0000	1.3
+@@ -6,7 +6,7 @@
+ 
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
+ 
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+--- ld/testsuite/ld-x86-64/pr13082-6a.d	21 Oct 2011 19:37:15 -0000	1.2
++++ ld/testsuite/ld-x86-64/pr13082-6a.d	9 Mar 2012 16:28:38 -0000	1.3
+@@ -6,7 +6,7 @@
+ 
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
+ 
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+--- ld/testsuite/ld-x86-64/pr13082-6b.d	21 Oct 2011 19:37:15 -0000	1.2
++++ ld/testsuite/ld-x86-64/pr13082-6b.d	9 Mar 2012 16:28:38 -0000	1.3
+@@ -6,7 +6,7 @@
+ 
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
+ 
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend
diff --git a/binutils.spec b/binutils.spec
index bd91e6d..f4c2e8d 100644
--- a/binutils.spec
+++ b/binutils.spec
@@ -17,7 +17,7 @@
 Summary: A GNU collection of binary utilities
 Name: %{?cross}binutils%{?_with_debug:-debug}
 Version: 2.22.52.0.1
-Release: 9%{?dist}
+Release: 10%{?dist}
 License: GPLv3+
 Group: Development/Tools
 URL: http://sources.redhat.com/binutils
@@ -47,6 +47,8 @@ Patch11: binutils-2.22.52.0.1-relro-on-by-default.patch
 Patch12: binutils-2.22.52.0.1-x86_64-hidden-ifunc.patch
 # From upstream
 Patch13: binutils-2.22.52.0.1-tsx.patch
+# From upstream
+Patch14: binutils-2.22.52.0.1-hidden-ifunc.patch
 
 %define gold_arches %ix86 x86_64
 
@@ -152,6 +154,7 @@ using libelf instead of BFD.
 %endif
 %patch12 -p0 -b .x86_64-hidden-ifunc~
 %patch13 -p0 -b .tsx~
+%patch14 -p0 -b .hidden-ifunc~
 
 # We cannot run autotools as there is an exact requirement of autoconf-2.59.
 
@@ -446,6 +449,9 @@ exit 0
 %endif # %{isnative}
 
 %changelog
+* Fri Mar 16 2012 Jakub Jelinek <jakub at redhat.com> - 2.22.52.0.1-10
+- Fix up handling of hidden ifunc relocs on i?86
+
 * Wed Mar 13 2012 Jeff Law <law at redhat.com> - 2.22.52.0.1-9
 - Fix c++filt docs (2nd instance) (#797752)
 


More information about the scm-commits mailing list