Loading pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch 0 → 100644 +99 −0 Original line number Diff line number Diff line From a388b7afeffad6411686d39dc1c62294da48a814 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> 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 pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch 0 → 100644 +161 −0 Original line number Diff line number Diff line From 36088682f447540fd8666a2c437fa232064044a7 Mon Sep 17 00:00:00 2001 From: Alan Modra <amodra@gmail.com> 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 Loading
pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch 0 → 100644 +99 −0 Original line number Diff line number Diff line From a388b7afeffad6411686d39dc1c62294da48a814 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> 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
pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch 0 → 100644 +161 −0 Original line number Diff line number Diff line From 36088682f447540fd8666a2c437fa232064044a7 Mon Sep 17 00:00:00 2001 From: Alan Modra <amodra@gmail.com> 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