diff --git a/pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch b/pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch new file mode 100644 index 00000000000..2ec90128347 --- /dev/null +++ b/pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch @@ -0,0 +1,99 @@ +From a388b7afeffad6411686d39dc1c62294da48a814 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Wed, 2 Aug 2017 05:10:29 -0700 +Subject: [PATCH] Check ELF section header only for ELF output + +When placing an orphan input section, check ELF section header only for +ELF output. + + PR ld/21884 + * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Check + ELF section header only for ELF output. + * testsuite/ld-elf/pr21884.d: New test. + * testsuite/ld-elf/pr21884.t: Likewise. + * testsuite/ld-elf/pr21884a.s: Likewise. + * testsuite/ld-elf/pr21884b.s: Likewise. + +(cherry picked from commit db99ecc08f5b66fbe9cb72e90352c7f77ec71a6e) +--- + ld/ChangeLog | 10 ++++++++++ + ld/emultempl/elf32.em | 3 ++- + ld/testsuite/ld-elf/pr21884.d | 11 +++++++++++ + ld/testsuite/ld-elf/pr21884.t | 7 +++++++ + ld/testsuite/ld-elf/pr21884a.s | 5 +++++ + ld/testsuite/ld-elf/pr21884b.s | 5 +++++ + 6 files changed, 40 insertions(+), 1 deletion(-) + create mode 100644 ld/testsuite/ld-elf/pr21884.d + create mode 100644 ld/testsuite/ld-elf/pr21884.t + create mode 100644 ld/testsuite/ld-elf/pr21884a.s + create mode 100644 ld/testsuite/ld-elf/pr21884b.s + +diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em +index d2551b6..75ded12 100644 +--- a/ld/emultempl/elf32.em ++++ b/ld/emultempl/elf32.em +@@ -2136,7 +2136,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + } + + /* Look through the script to see where to place this section. */ +- if (constraint == 0) ++ if (constraint == 0 ++ && link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour) + for (os = lang_output_section_find (secname); + os != NULL; + os = next_matching_output_section_statement (os, 0)) +diff --git a/ld/testsuite/ld-elf/pr21884.d b/ld/testsuite/ld-elf/pr21884.d +new file mode 100644 +index 0000000..52cd2c1 +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr21884.d +@@ -0,0 +1,11 @@ ++#source: pr21884a.s ++#source: pr21884b.s ++#ld: -T pr21884.t ++#objdump: -b binary -s ++#notarget: aarch64*-*-* arm*-*-* nds32*-*-* ++# Skip targets which can't change output format to binary. ++ ++.*: file format binary ++ ++Contents of section .data: ++#pass +diff --git a/ld/testsuite/ld-elf/pr21884.t b/ld/testsuite/ld-elf/pr21884.t +new file mode 100644 +index 0000000..d483911 +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr21884.t +@@ -0,0 +1,7 @@ ++OUTPUT_FORMAT("binary") ++ ++ENTRY(_main); ++SECTIONS { ++ . = 0; ++ .setup : { *(.setup) } ++} +diff --git a/ld/testsuite/ld-elf/pr21884a.s b/ld/testsuite/ld-elf/pr21884a.s +new file mode 100644 +index 0000000..a3361b2 +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr21884a.s +@@ -0,0 +1,5 @@ ++ .text ++ .globl _main ++ .type _main,%function ++_main: ++ .dc.a bar +diff --git a/ld/testsuite/ld-elf/pr21884b.s b/ld/testsuite/ld-elf/pr21884b.s +new file mode 100644 +index 0000000..e533837 +--- /dev/null ++++ b/ld/testsuite/ld-elf/pr21884b.s +@@ -0,0 +1,5 @@ ++ .text ++ .globl bar ++ .type bar,%function ++bar: ++ .byte 0 +-- +2.9.3 + diff --git a/pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch b/pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch new file mode 100644 index 00000000000..7e7566aec43 --- /dev/null +++ b/pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch @@ -0,0 +1,161 @@ +From 36088682f447540fd8666a2c437fa232064044a7 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Thu, 3 Aug 2017 14:01:34 +0930 +Subject: [PATCH] ELF checks for orphan placement + +The loop checking for previous orphan placement should run even when +the output is non-ELF. + + PR ld/21884 + * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Revert + last change. Rename iself to elfinput. Expand comments. Condition + ELF checks on having both input and output ELF files. Extract.. + (elf_orphan_compatible): ..this new function. +--- + ld/ChangeLog | 8 ++++++ + ld/emultempl/elf32.em | 76 +++++++++++++++++++++++++++++++-------------------- + 2 files changed, 55 insertions(+), 29 deletions(-) + +diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em +index 75ded12..9ac1840 100644 +--- a/ld/emultempl/elf32.em ++++ b/ld/emultempl/elf32.em +@@ -2008,6 +2008,29 @@ output_rel_find (asection *sec, int isdyn) + return last; + } + ++/* 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. */ + +@@ -2064,8 +2087,9 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + 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; + +@@ -2073,7 +2097,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + && link_info.combreloc + && (s->flags & SEC_ALLOC)) + { +- if (iself) ++ if (elfinput) + switch (sh_type) + { + case SHT_RELA: +@@ -2095,6 +2119,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + } + + if (!bfd_link_relocatable (&link_info) ++ && elfinput ++ && elfoutput + && (s->flags & SEC_ALLOC) != 0 + && (elf_section_flags (s) & SHF_GNU_MBIND) != 0) + { +@@ -2135,9 +2161,11 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + secname = ".mbind.text"; + } + +- /* Look through the script to see where to place this section. */ +- if (constraint == 0 +- && link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour) ++ /* Look through the script to see where to place this section. The ++ script includes entries added by previous lang_insert_orphan ++ calls, so this loop puts multiple compatible orphans of the same ++ name into a single output section. */ ++ if (constraint == 0) + for (os = lang_output_section_find (secname); + os != NULL; + os = next_matching_output_section_statement (os, 0)) +@@ -2146,29 +2174,19 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + 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. +- If the section already exists but does not have any flags +- set, then it has been created by the linker, probably as a +- result of a --section-start command line switch. */ + lang_add_section (&os->children, s, NULL, os); + return os; + } +@@ -2244,8 +2262,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + 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]; +@@ -2255,8 +2273,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, + 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) +-- +2.9.3 +