From 45f57ff34157b59220839f7deaaaba4fb17844e4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mar 16 2012 15:37:59 +0000 Subject: Fix up handling of hidden ifunc relocs on i?86 --- 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 + + 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 - 2.22.52.0.1-10 +- Fix up handling of hidden ifunc relocs on i?86 + * Wed Mar 13 2012 Jeff Law - 2.22.52.0.1-9 - Fix c++filt docs (2nd instance) (#797752)