Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
260 additions
and
0 deletions.
There are no files selected for viewing
99 changes: 99 additions & 0 deletions
99
pkgs/development/tools/misc/binutils/elf-check-orphan-input.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
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 | ||
|
161 changes: 161 additions & 0 deletions
161
pkgs/development/tools/misc/binutils/elf-check-orphan-placement.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
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 | ||
|