svn commit: r214159 - in projects/binutils-2.17/contrib/binutils/ld: . emultempl

Dimitry Andric dim at FreeBSD.org
Thu Oct 21 19:27:28 UTC 2010


Author: dim
Date: Thu Oct 21 19:27:27 2010
New Revision: 214159
URL: http://svn.freebsd.org/changeset/base/214159

Log:
  Reapply change from r210245.  In binutils 2.17, the code in question has
  moved from ld/emultempl/elf32.em to ld/ldlang.c, so apply approximately
  the same change as upstream, which has description:
  
  * ldlang.c (lang_insert_orphan): Add __start_<section> symbol assignment
    inside output section statement.  Ensure only one set of symbols per
    output section.
  * emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Add non-dollar
    sections before dollar sections.  Correct add_child list insertion.
  
  Taken from upstream git commit 7e01d69a19a8fd079887f26853c8565da15ff340,
  with permission to use it under GPLv2 from the author.

Modified:
  projects/binutils-2.17/contrib/binutils/ld/emultempl/pe.em
  projects/binutils-2.17/contrib/binutils/ld/ldlang.c

Modified: projects/binutils-2.17/contrib/binutils/ld/emultempl/pe.em
==============================================================================
--- projects/binutils-2.17/contrib/binutils/ld/emultempl/pe.em	Thu Oct 21 19:17:40 2010	(r214158)
+++ projects/binutils-2.17/contrib/binutils/ld/emultempl/pe.em	Thu Oct 21 19:27:27 2010	(r214159)
@@ -1525,6 +1525,7 @@ gld_${EMULATION_NAME}_place_orphan (asec
   char *dollar = NULL;
   lang_output_section_statement_type *os;
   lang_statement_list_type add_child;
+  lang_statement_union_type **pl;
 
   secname = bfd_get_section_name (s->owner, s);
 
@@ -1644,47 +1645,29 @@ gld_${EMULATION_NAME}_place_orphan (asec
       os = lang_insert_orphan (s, secname, after, place, address, &add_child);
     }
 
-  {
-    lang_statement_union_type **pl = &os->children.head;
-
-    if (dollar != NULL)
-      {
-	bfd_boolean found_dollar;
-
-	/* The section name has a '$'.  Sort it with the other '$'
-	   sections.  */
-	found_dollar = FALSE;
-	for ( ; *pl != NULL; pl = &(*pl)->header.next)
-	  {
-	    lang_input_section_type *ls;
-	    const char *lname;
+  /* If the section name has a '\$', sort it with the other '\$'
+     sections.  */
+  for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
+    {
+      lang_input_section_type *ls;
+      const char *lname;
 
-	    if ((*pl)->header.type != lang_input_section_enum)
-	      continue;
+      if ((*pl)->header.type != lang_input_section_enum)
+	continue;
 
-	    ls = &(*pl)->input_section;
+      ls = &(*pl)->input_section;
 
-	    lname = bfd_get_section_name (ls->section->owner, ls->section);
-	    if (strchr (lname, '$') == NULL)
-	      {
-		if (found_dollar)
-		  break;
-	      }
-	    else
-	      {
-		found_dollar = TRUE;
-		if (strcmp (orig_secname, lname) < 0)
-		  break;
-	      }
-	  }
-      }
+      lname = bfd_get_section_name (ls->section->owner, ls->section);
+      if (strchr (lname, '\$') != NULL
+	  && (dollar == NULL || strcmp (orig_secname, lname) < 0))
+	break;
+    }
 
-    if (add_child.head != NULL)
-      {
-	add_child.head->header.next = *pl;
-	*pl = add_child.head;
-      }
-  }
+  if (add_child.head != NULL)
+    {
+      *add_child.tail = *pl;
+      *pl = add_child.head;
+    }
 
   return TRUE;
 }

Modified: projects/binutils-2.17/contrib/binutils/ld/ldlang.c
==============================================================================
--- projects/binutils-2.17/contrib/binutils/ld/ldlang.c	Thu Oct 21 19:17:40 2010	(r214158)
+++ projects/binutils-2.17/contrib/binutils/ld/ldlang.c	Thu Oct 21 19:27:27 2010	(r214159)
@@ -1349,8 +1349,26 @@ lang_insert_orphan (asection *s,
       lang_list_init (stat_ptr);
     }
 
+  if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
+    address = exp_intop (0);
+
+  load_base = NULL;
+  if (after != NULL && after->load_base != NULL)
+    {
+      etree_type *lma_from_vma;
+      lma_from_vma = exp_binop ('-', after->load_base,
+				exp_nameop (ADDR, after->name));
+      load_base = exp_binop ('+', lma_from_vma,
+			     exp_nameop (ADDR, secname));
+    }
+
+  os_tail = ((lang_output_section_statement_type **)
+	     lang_output_section_statement.tail);
+  os = lang_enter_output_section_statement (secname, address, 0, NULL, NULL,
+					    load_base, 0);
+
   ps = NULL;
-  if (config.build_constructors)
+  if (config.build_constructors && *os_tail == os)
     {
       /* If the name of the section is representable in C, then create
 	 symbols to mark the start and the end of the section.  */
@@ -1373,24 +1391,6 @@ lang_insert_orphan (asection *s,
 	}
     }
 
-  if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
-    address = exp_intop (0);
-
-  load_base = NULL;
-  if (after != NULL && after->load_base != NULL)
-    {
-      etree_type *lma_from_vma;
-      lma_from_vma = exp_binop ('-', after->load_base,
-				exp_nameop (ADDR, after->name));
-      load_base = exp_binop ('+', lma_from_vma,
-			     exp_nameop (ADDR, secname));
-    }
-
-  os_tail = ((lang_output_section_statement_type **)
-	     lang_output_section_statement.tail);
-  os = lang_enter_output_section_statement (secname, address, 0, NULL, NULL,
-					    load_base, 0);
-
   if (add_child == NULL)
     add_child = &os->children;
   lang_add_section (add_child, s, os);


More information about the svn-src-projects mailing list