diff --git a/binutils-2.29-non-elf-orphan-skip.patch b/binutils-2.29-non-elf-orphan-skip.patch new file mode 100644 index 0000000..30cf390 --- /dev/null +++ b/binutils-2.29-non-elf-orphan-skip.patch @@ -0,0 +1,117 @@ +--- binutils.orig/ld/emultempl/elf32.em 2017-09-14 15:35:45.971100712 +0100 ++++ binutils-2.29/ld/emultempl/elf32.em 2017-09-14 15:40:30.315782167 +0100 +@@ -2011,6 +2011,29 @@ output_rel_find (asection *sec, int isdy + + static int orphan_init_done = 0; + ++/* Return whether IN is suitable to be part of OUT. */ ++ ++static bfd_boolean ++elf_orphan_compatible (asection *in, asection *out) ++{ ++ /* Non-zero sh_info implies a section with SHF_INFO_LINK with ++ unknown semantics for the generic linker, or a SHT_REL/SHT_RELA ++ section where sh_info specifies a symbol table. (We won't see ++ SHT_GROUP, SHT_SYMTAB or SHT_DYNSYM sections here.) We clearly ++ can't merge SHT_REL/SHT_RELA using differing symbol tables, and ++ shouldn't merge sections with differing unknown semantics. */ ++ if (elf_section_data (out)->this_hdr.sh_info ++ != elf_section_data (in)->this_hdr.sh_info) ++ return FALSE; ++ /* We can't merge two sections with differing SHF_EXCLUDE when doing ++ a relocatable link. */ ++ if (bfd_link_relocatable (&link_info) ++ && ((elf_section_flags (out) ^ elf_section_flags (in)) & SHF_EXCLUDE) != 0) ++ return FALSE; ++ return _bfd_elf_match_sections_by_type (link_info.output_bfd, out, ++ in->owner, in); ++} ++ + /* Place an orphan section. We use this to put random SHF_ALLOC + sections in the right segment. */ + +@@ -2067,8 +2090,9 @@ gld${EMULATION_NAME}_place_orphan (asect + lang_output_section_statement_type *os; + lang_output_section_statement_type *match_by_name = NULL; + int isdyn = 0; +- int iself = s->owner->xvec->flavour == bfd_target_elf_flavour; +- unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL; ++ int elfinput = s->owner->xvec->flavour == bfd_target_elf_flavour; ++ int elfoutput = link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour; ++ unsigned int sh_type = elfinput ? elf_section_type (s) : SHT_NULL; + flagword flags; + asection *nexts; + +@@ -2076,7 +2100,7 @@ gld${EMULATION_NAME}_place_orphan (asect + && link_info.combreloc + && (s->flags & SEC_ALLOC)) + { +- if (iself) ++ if (elfinput) + switch (sh_type) + { + case SHT_RELA: +@@ -2098,6 +2122,8 @@ gld${EMULATION_NAME}_place_orphan (asect + } + + if (!bfd_link_relocatable (&link_info) ++ && elfinput ++ && elfoutput + && (s->flags & SEC_ALLOC) != 0 + && (elf_section_flags (s) & SHF_GNU_MBIND) != 0) + { +@@ -2148,23 +2174,18 @@ gld${EMULATION_NAME}_place_orphan (asect + lang_insert_orphan to create a new output section. */ + constraint = SPECIAL; + +- /* SEC_EXCLUDE is cleared when doing a relocatable link. But +- we can't merge 2 input sections with the same name when only +- one of them has SHF_EXCLUDE. Don't merge 2 sections with +- different sh_info. */ ++ /* Check to see if we already have an output section statement ++ with this name, and its bfd section has compatible flags. ++ If the section already exists but does not have any flags ++ set, then it has been created by the linker, possibly as a ++ result of a --section-start command line switch. */ + if (os->bfd_section != NULL +- && (elf_section_data (os->bfd_section)->this_hdr.sh_info +- == elf_section_data (s)->this_hdr.sh_info) + && (os->bfd_section->flags == 0 +- || ((!bfd_link_relocatable (&link_info) +- || (iself && (((elf_section_flags (s) +- ^ elf_section_flags (os->bfd_section)) +- & SHF_EXCLUDE) == 0))) +- && ((s->flags ^ os->bfd_section->flags) ++ || (((s->flags ^ os->bfd_section->flags) + & (SEC_LOAD | SEC_ALLOC)) == 0 +- && _bfd_elf_match_sections_by_type (link_info.output_bfd, +- os->bfd_section, +- s->owner, s)))) ++ && (!elfinput ++ || !elfoutput ++ || elf_orphan_compatible (s, os->bfd_section))))) + { + /* We already have an output section statement with this + name, and its bfd section has compatible flags. +@@ -2253,8 +2274,8 @@ gld${EMULATION_NAME}_place_orphan (asect + else if ((flags & SEC_ALLOC) == 0) + ; + else if ((flags & SEC_LOAD) != 0 +- && ((iself && sh_type == SHT_NOTE) +- || (!iself && CONST_STRNEQ (secname, ".note")))) ++ && ((elfinput && sh_type == SHT_NOTE) ++ || (!elfinput && CONST_STRNEQ (secname, ".note")))) + place = &hold[orphan_interp]; + else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0) + place = &hold[orphan_bss]; +@@ -2264,8 +2285,8 @@ gld${EMULATION_NAME}_place_orphan (asect + place = &hold[orphan_tdata]; + else if ((flags & SEC_READONLY) == 0) + place = &hold[orphan_data]; +- else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL)) +- || (!iself && CONST_STRNEQ (secname, ".rel"))) ++ else if (((elfinput && (sh_type == SHT_RELA || sh_type == SHT_REL)) ++ || (!elfinput && CONST_STRNEQ (secname, ".rel"))) + && (flags & SEC_LOAD) != 0) + place = &hold[orphan_rel]; + else if ((flags & SEC_CODE) == 0) diff --git a/binutils.spec b/binutils.spec index 2872b34..9a70e12 100644 --- a/binutils.spec +++ b/binutils.spec @@ -54,13 +54,13 @@ Summary: A GNU collection of binary utilities Name: %{?cross}binutils%{?_with_debug:-debug} Version: 2.29 -Release: 7%{?dist} +Release: 8%{?dist} License: GPLv3+ Group: Development/Tools URL: http://sources.redhat.com/binutils -# Note - the Linux Kernel binutils releases are too unstable and contain too -# many controversial patches so we stick with the official FSF version +# Note - the Linux Kernel binutils releases are too unstable and contain +# too many controversial patches so we stick with the official FSF version # instead. Source: http://ftp.gnu.org/gnu/binutils/binutils-%{version}.tar.xz @@ -101,7 +101,8 @@ Patch06: binutils-2.22.52.0.1-export-demangle.h.patch Patch07: binutils-2.22.52.0.4-no-config-h-check.patch # Purpose: Import H.J.Lu's Kernel LTO patch. -# Lifetime: Permanent, but needs continual updating. +# Lifetime: Permanent, but needs continual updating. +# FIXME: Try removing.... Patch11: binutils-2.26-lto.patch # Purpose: Skip PR14918 linker test for ARM native targets. @@ -119,6 +120,11 @@ Patch13: binutils-2.29-filename-in-error-messages.patch # Lifetime: Fixed in 2.29.1. Patch15: binutils-2.29-ppc64-plt-localentry0-disable.patch +# Purpose: Prevent a seg-fault in the linker by not attempting to place orphan ELF +# sections into a non-ELF output section. +# Lifetime: Fixed in 2.29.1. +Patch16: binutils-2.29-non-elf-orphan-skip.patch + #--------------------------------------------------------------------------------- Provides: bundled(libiberty) @@ -242,7 +248,7 @@ using libelf instead of BFD. %prep %setup -q -n binutils-%{version} -%patch01 -p1 +%patch01 -p1 %patch02 -p1 %patch04 -p1 %patch06 -p1 @@ -251,6 +257,7 @@ using libelf instead of BFD. %patch12 -p1 %patch13 -p1 %patch15 -p1 +%patch16 -p1 # We cannot run autotools as there is an exact requirement of autoconf-2.59. @@ -648,6 +655,10 @@ exit 0 #--------------------------------------------------------------------------------- %changelog +* Thu Sep 14 2017 Nick Clifton 2.29-8 +- Import fix for PR 21884 which stops a seg-fault in the linker when changing output format to binary during a final link. + (#1491023) + * Sun Sep 10 2017 Nick Clifton - 2.29-7 - Annotate patches with reason and lifetime expectances. - Retire: binutils-2.24-ldforcele.patch