This is the mail archive of the binutils@sources.redhat.com 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]

patch for pe place_orphan


The ELF linker has defined symbols `__start_SECTION' and `__stop_SECTION' to 
delimit orphan sections for quite some time (since 1994, in fact).  I'd like 
to apply the patch below to make the PE linker behave similarly.  Is this OK?

p.

Index: emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.37
diff -u -p -r1.37 pe.em
--- pe.em	2000/10/16 19:08:45	1.37
+++ pe.em	2000/11/09 10:54:59
@@ -1263,6 +1144,7 @@ gld_${EMULATION_NAME}_place_orphan (file
   const char *secname;
   char *hold_section_name;
   char *dollar = NULL;
+  const char *ps = NULL;
   lang_output_section_statement_type *os;
   lang_statement_list_type add_child;
 
@@ -1354,6 +1236,26 @@ gld_${EMULATION_NAME}_place_orphan (file
       stat_ptr = &add;
       lang_list_init (stat_ptr);
 
+      if (config.build_constructors)
+	{
+	  /* If the name of the section is representable in C, then create
+	     symbols to mark the start and the end of the section.  */
+	  for (ps = outsecname; *ps != '\0'; ps++)
+	    if (! isalnum ((unsigned char) *ps) && *ps != '_')
+	      break;
+	  if (*ps == '\0')
+	    {
+	      char *symname;
+	      etree_type *e_align;
+	      
+	      symname = (char *) xmalloc (ps - outsecname + sizeof "___start_");
+	      sprintf (symname, "___start_%s", outsecname);
+	      e_align = exp_unop (ALIGN_K,
+				  exp_intop ((bfd_vma) 1 << s->alignment_power));
+	      lang_add_assignment (exp_assop ('=', symname, e_align));
+	    }
+	}
+      
       if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
 	address = exp_intop ((bfd_vma) 0);
       else
@@ -1376,6 +1278,21 @@ gld_${EMULATION_NAME}_place_orphan (file
 	((bfd_vma) 0, "*default*",
 	 (struct lang_output_section_phdr_list *) NULL, "*default*");
 
+      if (config.build_constructors && *ps == '\0')
+        {
+	  char *symname;
+
+	  /* lang_leave_ouput_section_statement resets stat_ptr.  Put
+	     stat_ptr back where we want it.  */
+	  if (place != NULL)
+	    stat_ptr = &add;
+	  
+	  symname = (char *) xmalloc (ps - outsecname + sizeof "___stop_");
+	  sprintf (symname, "___stop_%s", outsecname);
+	  lang_add_assignment (exp_assop ('=', symname,
+					  exp_nameop (NAME, ".")));
+	}
+
       stat_ptr = old;
 
       if (place != NULL)



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