This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR ld/21884: Check ELF section header only for ELF output


On Wed, Aug 02, 2017 at 06:09:31AM -0700, H.J. Lu wrote:
> On Wed, Aug 2, 2017 at 5:54 AM, Alan Modra <amodra@gmail.com> wrote:
> > On Wed, Aug 02, 2017 at 04:53:51AM -0700, H.J. Lu wrote:
> >> --- 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))
> >
> > This doesn't look to be the right place to me.  I think the loop
> > should run but the ELF specific tests be omitted when either input or
> > output is non-ELF.
> >
> > Also, there is a similar problem with the .mbind code just a little
> > earlier.
> 
> We can do something like this.  There is no need to check for
> ELF specific info if either input or output isn't ELF.

The mbind change is fine, but you don't understand the purpose of the
other loop you changed.  Incidentally, the following fails need to be
analysed.  Please do that.

avr-elf  +FAIL: ld-elf/pr21884
hppa-linux  +FAIL: ld-elf/pr21884
ia64-elf  +FAIL: ld-elf/pr21884
ia64-freebsd5  +FAIL: ld-elf/pr21884
ia64-linux  +FAIL: ld-elf/pr21884
ia64-netbsd  +FAIL: ld-elf/pr21884
m68hc11-elf  +FAIL: ld-elf/pr21884
m68hc12-elf  +FAIL: ld-elf/pr21884
score-elf  +FAIL: ld-elf/pr21884

I'm going to commit the following after my usual set of regression
tests complete.  The added comments hopefully will make the code
clearer.

	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.

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)


-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]