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: bfd_sizeof_headers


On Mon, Jun 19, 2006 at 10:29:45PM +0930, Alan Modra wrote:
> A followup patch will make "not enough room for program headers" a thing
> of the past.

This implements linker relaxation on ELF targets for SIZEOF_HEADERS in
linker scripts.  ie. ld repeats section layout if it finds that its
initial guess for program header count is incorrect.  To do this, ld
must set up the segment map much earlier, which isn't particularly
difficult but does mean that some things are not available to
elf_backend_modify_segment_map, eg. link_order structs used in the ia64
version.  I hacked around this particular problem by calling
elf_backend_modify_segment_map late as well as early, so ia64 gets to
look at link_orders on the final call.  elf_backend_modify_segment_map
needs to be made safe for multiple calls anyway.

Calling elf_backend_modify_segment_map early does break FRV and
Blackfin:  Changing the size of an output section in modify_segment_map
now actually changes the size in the object file.  So these targets will
get a useless 0x20000 byte increase in files size of final linked
objects.  I imagine that won't overjoy anyone.  However, I think the
general usefulness of improving SIZEOF_HEADERS like this allows me to
(further) break these targets temporarily.  If none of the relevant
target maintainers replies to my other email about PT_GNU_STACK
breakage, I'll implement code to set PT_GNU_STACK p_memsz and p_align
for FRV and Blackfin without using a bogus .stack output section.

bfd/
	* elf-bfd.h: Formatting.
	(_bfd_elf_map_sections_to_segments): Declare.
	* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame_hdr): Don't
	clear program_header_size.
	* elf.c (get_program_header_size): Move.  Don't use or set saved
	program_header_size here.
	(elf_modify_segment_map): New function.  Split out from..
	(assign_file_positions_for_load_sections): ..here.  Assert
	header size is correct.  Remove dead code.
	(_bfd_elf_map_sections_to_segments): Rename from
	map_sections_to_segments.  Make global.  Use get_program_header_size
	when we need estimate of header size.  Call elf_modify_segment_map.
	Set program_header_size.
	(print_segment_map): Delete.
	(_bfd_elf_sizeof_headers): If segment_map available, get the
	actual size.
	* elf32-arm.c (elf32_arm_symbian_modify_segment_map): Make safe
	for calling more than once.
	* elf32-bfin.c (elf32_bfinfdpic_modify_segment_map): Likewise.
	* elf32-frv.c (elf32_frvfdpic_modify_segment_map): Likewise.
	* elfxx-mips.c (_bfd_mips_elf_modify_segment_map): Likewise.
	* elf32-i370.c (elf_backend_add_symbol_hook): Delete.
	(elf_backend_additional_program_headers): Delete.
	(elf_backend_modify_segment_map): Delete.
	* elf64-hppa.c (elf64_hppa_modify_segment_map): Convert to ISO C.
	* elfxx-ia64.c (elfNN_ia64_modify_segment_map): Likewise.
	* doc/bfdint.texi: Delete SIZEOF_HEADERS difficulties.
ld/
	* Makefile.am (ELF_DEPS): Define.  Use in emul file deps.  Fix
	many ELF emul file deps that incorrectly said they needed elf32.em
	instead of generic.em.  Add genelf.em as required.
	* Makefile.in: Regenerate.
	* ldlang.c (lang_process): Call ldemul_finish before
	lang_check_section_addresses.
	* emulparams/arcelf.sh: Generic elf target needs genelf.
	* emulparams/d30v_e.sh: Likewise.
	* emulparams/d30v_o.sh: Likewise.
	* emulparams/d30velf.sh: Likewise.
	* emulparams/elf32_dlx.sh: Likewise.
	* emulparams/elf32_i860.sh: Likewise.
	* emulparams/elf32fr30.sh: Likewise.
	* emulparams/elf32frv.sh: Likewise.
	* emulparams/elf32iq10.sh: Likewise.
	* emulparams/elf32iq2000.sh: Likewise.
	* emulparams/elf32mt.sh: Likewise.
	* emulparams/mn10200.sh: Likewise.
	* emulparams/or32.sh: Likewise.
	* emulparams/or32elf.sh: Likewise.
	* emulparams/pjelf.sh: Likewise.
	* emulparams/msp430all.sh: Likewise.  Extract common entries.
	* emulparams/pjlelf.sh: Include pjelf.sh.
	* emulparams/elf32frvfd.sh (EXTRA_EM_FILE): Unset.
	* emulparams/mn10300.sh (EXTRA_EM_FILE): Unset.
	* emultempl/elf-generic.em: New file.
	* emultempl/genelf.em: New file.
	* emultempl/elf32.em: Include elf-generic.em.
	(gld${EMULATION_NAME}_layout_sections_again): Delete.
	(gld${EMULATION_NAME}_finish): Call gld${EMULATION_NAME}_map_segments.
	* emultempl/hppaelf.em (hppaelf_layout_sections_again): Likewise.
	(gld${EMULATION_NAME}_finish): Rename from hppaelf_finish.  Call
	gld${EMULATION_NAME}_map_segments.
	(LDEMUL_FINISH): Update.
	* emultempl/mmo.em: Correct comment.  Include elf-bfd.h and
	source elf-generic.em.
	(mmo_finish): Call gld${EMULATION_NAME}_map_segments.
	* emultempl/ppc64elf.em (ppc_layout_sections_again): Likewise.
	(gld${EMULATION_NAME}_finish): Rename from ppc_finish.  Call
	gld${EMULATION_NAME}_map_segments.
	(LDEMUL_FINISH): Update.
ld/testsuite/
	* ld-elf/eh1.d: Update for fewer program headers.
	* ld-elf/eh2.d: Likewise.
	* ld-elf/eh3.d: Likewise.

Note that this patch was made using "diff -w".  Backports etc. should
get the real diff from CVS, or be prepared to fix formatting in elf.c.

Index: bfd/elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.208
diff -u -p -w -r1.208 elf-bfd.h
--- bfd/elf-bfd.h	19 Jun 2006 13:17:43 -0000	1.208
+++ bfd/elf-bfd.h	20 Jun 2006 00:52:40 -0000
@@ -1864,10 +1864,12 @@ extern bfd_boolean bfd_elf_gc_common_fin
 extern bfd_boolean bfd_elf_reloc_symbol_deleted_p
   (bfd_vma, void *);
 
-extern struct elf_segment_map *
-_bfd_elf_make_dynamic_segment
+extern struct elf_segment_map * _bfd_elf_make_dynamic_segment
   (bfd *, asection *);
 
+extern bfd_boolean _bfd_elf_map_sections_to_segments
+  (bfd *, struct bfd_link_info *);
+
 /* Exported interface for writing elf corefile notes. */
 extern char *elfcore_write_note
   (bfd *, char *, int *, const char *, int, const void *, int);
Index: bfd/elf-eh-frame.c
===================================================================
RCS file: /cvs/src/src/bfd/elf-eh-frame.c,v
retrieving revision 1.50
diff -u -p -w -r1.50 elf-eh-frame.c
--- bfd/elf-eh-frame.c	24 May 2006 02:37:47 -0000	1.50
+++ bfd/elf-eh-frame.c	20 Jun 2006 00:52:42 -0000
@@ -846,8 +846,6 @@ _bfd_elf_discard_section_eh_frame_hdr (b
   if (hdr_info->table)
     sec->size += 4 + hdr_info->fde_count * 8;
 
-  /* Request program headers to be recalculated.  */
-  elf_tdata (abfd)->program_header_size = 0;
   elf_tdata (abfd)->eh_frame_hdr = sec;
   return TRUE;
 }
Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.343
diff -u -p -w -r1.343 elf.c
--- bfd/elf.c	19 Jun 2006 13:17:43 -0000	1.343
+++ bfd/elf.c	20 Jun 2006 00:52:46 -0000
@@ -3560,6 +3560,89 @@ _bfd_elf_compute_section_file_positions 
   return TRUE;
 }
 
+/* Make an initial estimate of the size of the program header.  If we
+   get the number wrong here, we'll redo section placement.  */
+
+static bfd_size_type
+get_program_header_size (bfd *abfd, struct bfd_link_info *info)
+{
+  size_t segs;
+  asection *s;
+  const struct elf_backend_data *bed;
+
+  /* Assume we will need exactly two PT_LOAD segments: one for text
+     and one for data.  */
+  segs = 2;
+
+  s = bfd_get_section_by_name (abfd, ".interp");
+  if (s != NULL && (s->flags & SEC_LOAD) != 0)
+    {
+      /* If we have a loadable interpreter section, we need a
+	 PT_INTERP segment.  In this case, assume we also need a
+	 PT_PHDR segment, although that may not be true for all
+	 targets.  */
+      segs += 2;
+    }
+
+  if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
+    {
+      /* We need a PT_DYNAMIC segment.  */
+      ++segs;
+    }
+
+  if (elf_tdata (abfd)->eh_frame_hdr)
+    {
+      /* We need a PT_GNU_EH_FRAME segment.  */
+      ++segs;
+    }
+
+  if (elf_tdata (abfd)->stack_flags)
+    {
+      /* We need a PT_GNU_STACK segment.  */
+      ++segs;
+    }
+
+  if (elf_tdata (abfd)->relro)
+    {
+      /* We need a PT_GNU_RELRO segment.  */
+      ++segs;
+    }
+
+  for (s = abfd->sections; s != NULL; s = s->next)
+    {
+      if ((s->flags & SEC_LOAD) != 0
+	  && strncmp (s->name, ".note", 5) == 0)
+	{
+	  /* We need a PT_NOTE segment.  */
+	  ++segs;
+	}
+    }
+
+  for (s = abfd->sections; s != NULL; s = s->next)
+    {
+      if (s->flags & SEC_THREAD_LOCAL)
+	{
+	  /* We need a PT_TLS segment.  */
+	  ++segs;
+	  break;
+	}
+    }
+
+  /* Let the backend count up any program headers it might need.  */
+  bed = get_elf_backend_data (abfd);
+  if (bed->elf_backend_additional_program_headers)
+    {
+      int a;
+
+      a = (*bed->elf_backend_additional_program_headers) (abfd, info);
+      if (a == -1)
+	abort ();
+      segs += a;
+    }
+
+  return segs * bed->s->sizeof_phdr;
+}
+
 /* Create a mapping from a set of sections to a program segment.  */
 
 static struct elf_segment_map *
@@ -3614,18 +3697,71 @@ _bfd_elf_make_dynamic_segment (bfd *abfd
   return m;
 }
 
-/* Set up a mapping from BFD sections to program segments.  */
+/* Possibly add or remove segments from the segment map.  */
 
 static bfd_boolean
-map_sections_to_segments (bfd *abfd)
+elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
+{
+  struct elf_segment_map *m;
+  const struct elf_backend_data *bed;
+
+  /* The placement algorithm assumes that non allocated sections are
+     not in PT_LOAD segments.  We ensure this here by removing such
+     sections from the segment map.  We also remove excluded
+     sections.  */
+  for (m = elf_tdata (abfd)->segment_map;
+       m != NULL;
+       m = m->next)
+    {
+      unsigned int i, new_count;
+
+      new_count = 0;
+      for (i = 0; i < m->count; i ++)
+	{
+	  if ((m->sections[i]->flags & SEC_EXCLUDE) == 0
+	      && ((m->sections[i]->flags & SEC_ALLOC) != 0
+		  || m->p_type != PT_LOAD))
+	    {
+	      if (i != new_count)
+		m->sections[new_count] = m->sections[i];
+
+	      new_count ++;
+	    }
+	}
+
+      if (new_count != m->count)
+	m->count = new_count;
+    }
+
+  /* Yes, we call elf_backend_modify_segment_map at least two times
+     for the linker.  The final time the link_orders are available.  */
+  bed = get_elf_backend_data (abfd);
+  if (bed->elf_backend_modify_segment_map != NULL)
+    {
+      if (! (*bed->elf_backend_modify_segment_map) (abfd, info))
+	return FALSE;
+    }
+
+  return TRUE;
+}
+
+/* Set up a mapping from BFD sections to program segments.  */
+
+bfd_boolean
+_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
 {
+  unsigned int count;
+  struct elf_segment_map *m;
   asection **sections = NULL;
+  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+
+  if (elf_tdata (abfd)->segment_map == NULL
+      && bfd_count_sections (abfd) != 0)
+    {
   asection *s;
   unsigned int i;
-  unsigned int count;
   struct elf_segment_map *mfirst;
   struct elf_segment_map **pm;
-  struct elf_segment_map *m;
   asection *last_hdr;
   bfd_vma last_size;
   unsigned int phdr_index;
@@ -3638,12 +3774,6 @@ map_sections_to_segments (bfd *abfd)
   asection *dynsec, *eh_frame_hdr;
   bfd_size_type amt;
 
-  if (elf_tdata (abfd)->segment_map != NULL)
-    return TRUE;
-
-  if (bfd_count_sections (abfd) == 0)
-    return TRUE;
-
   /* Select the allocated sections, and sort them.  */
 
   sections = bfd_malloc2 (bfd_count_sections (abfd), sizeof (asection *));
@@ -3708,7 +3838,7 @@ map_sections_to_segments (bfd *abfd)
   last_hdr = NULL;
   last_size = 0;
   phdr_index = 0;
-  maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
+      maxpagesize = bed->maxpagesize;
   writable = FALSE;
   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
   if (dynsec != NULL
@@ -3721,11 +3851,10 @@ map_sections_to_segments (bfd *abfd)
      program headers we will need.  */
   if (count > 0)
     {
-      bfd_size_type phdr_size;
+	  bfd_size_type phdr_size = elf_tdata (abfd)->program_header_size;
 
-      phdr_size = elf_tdata (abfd)->program_header_size;
       if (phdr_size == 0)
-	phdr_size = get_elf_backend_data (abfd)->s->sizeof_phdr;
+	    phdr_size = get_program_header_size (abfd, info);
       if ((abfd->flags & D_PAGED) == 0
 	  || sections[0]->lma < phdr_size
 	  || sections[0]->lma % maxpagesize < phdr_size % maxpagesize)
@@ -3804,7 +3933,8 @@ map_sections_to_segments (bfd *abfd)
 	    writable = TRUE;
 	  last_hdr = hdr;
 	  /* .tbss sections effectively have zero size.  */
-	  if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
+	      if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
+		  != SEC_THREAD_LOCAL)
 	    last_size = hdr->size;
 	  else
 	    last_size = 0;
@@ -3964,9 +4094,16 @@ map_sections_to_segments (bfd *abfd)
     }
 
   free (sections);
-  sections = NULL;
-
   elf_tdata (abfd)->segment_map = mfirst;
+    }
+
+  if (!elf_modify_segment_map (abfd, info))
+    return FALSE;
+
+  for (count = 0, m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
+    ++count;
+  elf_tdata (abfd)->program_header_size = count * bed->s->sizeof_phdr;
+
   return TRUE;
 
  error_return:
@@ -4062,42 +4199,6 @@ vma_page_aligned_bias (bfd_vma vma, ufil
   return ((vma - off) % maxpagesize);
 }
 
-static void
-print_segment_map (bfd *abfd)
-{
-  struct elf_segment_map *m;
-  unsigned int i, j;
-
-  fprintf (stderr, _(" Section to Segment mapping:\n"));
-  fprintf (stderr, _("  Segment              Sections...\n"));
-
-  for (i= 0, m = elf_tdata (abfd)->segment_map;
-       m != NULL;
-       i++, m = m->next)
-    {
-      const char *pt = get_segment_type (m->p_type);
-      char buf[32];
-
-      if (pt == NULL)
-	{
-	  if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
-	    sprintf (buf, "LOPROC+%7.7x",
-		     (unsigned int) (m->p_type - PT_LOPROC));
-	  else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
-	    sprintf (buf, "LOOS+%7.7x",
-		     (unsigned int) (m->p_type - PT_LOOS));
-	  else
-	    snprintf (buf, sizeof (buf), "%8.8x",
-		      (unsigned int) m->p_type);
-	  pt = buf;
-	}
-      fprintf (stderr, "  %2.2d: %14.14s:  ", i, pt);
-      for (j = 0; j < m->count; j++)
-	fprintf (stderr, "%s ", m->sections [j]->name);
-      putc ('\n',stderr);
-    }
-}
-
 /* Assign file positions to the sections based on the mapping from
    sections to segments.  This function also sets up some fields in
    the file header.  */
@@ -4112,84 +4213,30 @@ assign_file_positions_for_load_sections 
   Elf_Internal_Phdr *p;
   file_ptr off, voff;
   bfd_size_type maxpagesize;
-  unsigned int count;
   unsigned int alloc;
   unsigned int i;
 
-  if (elf_tdata (abfd)->segment_map == NULL)
-    {
-      if (! map_sections_to_segments (abfd))
+  if (!elf_modify_segment_map (abfd, link_info))
 	return FALSE;
-    }
-  else
-    {
-      /* The placement algorithm assumes that non allocated sections are
-	 not in PT_LOAD segments.  We ensure this here by removing such
-	 sections from the segment map.  We also remove excluded
-	 sections.  */
-      for (m = elf_tdata (abfd)->segment_map;
-	   m != NULL;
-	   m = m->next)
-	{
-	  unsigned int new_count;
 
-	  new_count = 0;
-	  for (i = 0; i < m->count; i ++)
-	    {
-	      if ((m->sections[i]->flags & SEC_EXCLUDE) == 0
-		  && ((m->sections[i]->flags & SEC_ALLOC) != 0
-		      || m->p_type != PT_LOAD))
-		{
-		  if (i != new_count)
-		    m->sections[new_count] = m->sections[i];
-
-		  new_count ++;
-		}
-	    }
-
-	  if (new_count != m->count)
-	    m->count = new_count;
-	}
-    }
-
-  if (bed->elf_backend_modify_segment_map)
-    {
-      if (! (*bed->elf_backend_modify_segment_map) (abfd, link_info))
-	return FALSE;
-    }
-
-  count = 0;
+  alloc = 0;
   for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
-    ++count;
+    ++alloc;
 
   elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
   elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
-  elf_elfheader (abfd)->e_phnum = count;
-
-  if (count == 0)
-    {
-      elf_tdata (abfd)->next_file_pos = bed->s->sizeof_ehdr;
-      return TRUE;
-    }
+  elf_elfheader (abfd)->e_phnum = alloc;
 
-  /* If we already counted the number of program segments, make sure
-     that we allocated enough space.  This happens when SIZEOF_HEADERS
-     is used in a linker script.  */
-  alloc = elf_tdata (abfd)->program_header_size / bed->s->sizeof_phdr;
-  if (alloc != 0 && count > alloc)
-    {
-      ((*_bfd_error_handler)
-       (_("%B: Not enough room for program headers (allocated %u, need %u)"),
-	abfd, alloc, count));
-      print_segment_map (abfd);
-      bfd_set_error (bfd_error_bad_value);
-      return FALSE;
-    }
+  if (elf_tdata (abfd)->program_header_size == 0)
+    elf_tdata (abfd)->program_header_size = alloc * bed->s->sizeof_phdr;
+  else
+    BFD_ASSERT (elf_tdata (abfd)->program_header_size
+		== alloc * bed->s->sizeof_phdr);
 
   if (alloc == 0)
     {
-      alloc = count;
-      elf_tdata (abfd)->program_header_size = alloc * bed->s->sizeof_phdr;
+      elf_tdata (abfd)->next_file_pos = bed->s->sizeof_ehdr;
+      return TRUE;
     }
 
   phdrs = bfd_alloc2 (abfd, alloc, sizeof (Elf_Internal_Phdr));
@@ -4527,13 +4574,6 @@ assign_file_positions_for_load_sections 
 	}
     }
 
-  /* Clear out any program headers we allocated but did not use.  */
-  for (; count < alloc; count++, p++)
-    {
-      memset (p, 0, sizeof *p);
-      p->p_type = PT_NULL;
-    }
-
   elf_tdata (abfd)->next_file_pos = off;
   return TRUE;
 }
@@ -4709,112 +4749,6 @@ assign_file_positions_for_non_load_secti
   return TRUE;
 }
 
-/* Get the size of the program header.
-
-   If this is called by the linker before any of the section VMA's are set, it
-   can't calculate the correct value for a strange memory layout.  This only
-   happens when SIZEOF_HEADERS is used in a linker script.  In this case,
-   SORTED_HDRS is NULL and we assume the normal scenario of one text and one
-   data segment (exclusive of .interp and .dynamic).
-
-   ??? User written scripts must either not use SIZEOF_HEADERS, or assume there
-   will be two segments.  */
-
-static bfd_size_type
-get_program_header_size (bfd *abfd, struct bfd_link_info *info)
-{
-  size_t segs;
-  asection *s;
-  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
-
-  /* We can't return a different result each time we're called.  */
-  if (elf_tdata (abfd)->program_header_size != 0)
-    return elf_tdata (abfd)->program_header_size;
-
-  if (elf_tdata (abfd)->segment_map != NULL)
-    {
-      struct elf_segment_map *m;
-
-      segs = 0;
-      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
-	++segs;
-      elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr;
-      return elf_tdata (abfd)->program_header_size;
-    }
-
-  /* Assume we will need exactly two PT_LOAD segments: one for text
-     and one for data.  */
-  segs = 2;
-
-  s = bfd_get_section_by_name (abfd, ".interp");
-  if (s != NULL && (s->flags & SEC_LOAD) != 0)
-    {
-      /* If we have a loadable interpreter section, we need a
-	 PT_INTERP segment.  In this case, assume we also need a
-	 PT_PHDR segment, although that may not be true for all
-	 targets.  */
-      segs += 2;
-    }
-
-  if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
-    {
-      /* We need a PT_DYNAMIC segment.  */
-      ++segs;
-    }
-
-  if (elf_tdata (abfd)->eh_frame_hdr)
-    {
-      /* We need a PT_GNU_EH_FRAME segment.  */
-      ++segs;
-    }
-
-  if (elf_tdata (abfd)->stack_flags)
-    {
-      /* We need a PT_GNU_STACK segment.  */
-      ++segs;
-    }
-
-  if (elf_tdata (abfd)->relro)
-    {
-      /* We need a PT_GNU_RELRO segment.  */
-      ++segs;
-    }
-
-  for (s = abfd->sections; s != NULL; s = s->next)
-    {
-      if ((s->flags & SEC_LOAD) != 0
-	  && strncmp (s->name, ".note", 5) == 0)
-	{
-	  /* We need a PT_NOTE segment.  */
-	  ++segs;
-	}
-    }
-
-  for (s = abfd->sections; s != NULL; s = s->next)
-    {
-      if (s->flags & SEC_THREAD_LOCAL)
-	{
-	  /* We need a PT_TLS segment.  */
-	  ++segs;
-	  break;
-	}
-    }
-
-  /* Let the backend count up any program headers it might need.  */
-  if (bed->elf_backend_additional_program_headers)
-    {
-      int a;
-
-      a = (*bed->elf_backend_additional_program_headers) (abfd, info);
-      if (a == -1)
-	abort ();
-      segs += a;
-    }
-
-  elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr;
-  return elf_tdata (abfd)->program_header_size;
-}
-
 /* Work out the file positions of all the sections.  This is called by
    _bfd_elf_compute_section_file_positions.  All the section sizes and
    VMAs must be known before this is called.
@@ -7118,11 +7052,24 @@ _bfd_elf_find_inliner_info (bfd *abfd,
 int
 _bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
 {
-  int ret;
+  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+  int ret = bed->s->sizeof_ehdr;
 
-  ret = get_elf_backend_data (abfd)->s->sizeof_ehdr;
   if (!info->relocatable)
-    ret += get_program_header_size (abfd, info);
+    {
+      struct elf_segment_map *m;
+      bfd_size_type phdr_size = 0;
+
+      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
+	phdr_size += bed->s->sizeof_phdr;
+
+      if (phdr_size == 0)
+	phdr_size = get_program_header_size (abfd, info);
+
+      elf_tdata (abfd)->program_header_size = phdr_size;
+      ret += phdr_size;
+    }
+
   return ret;
 }
 
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.81
diff -u -p -w -r1.81 elf32-arm.c
--- bfd/elf32-arm.c	19 Jun 2006 14:22:27 -0000	1.81
+++ bfd/elf32-arm.c	20 Jun 2006 00:52:51 -0000
@@ -9493,10 +9493,17 @@ elf32_arm_symbian_modify_segment_map (bf
   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
   if (dynsec)
     {
+      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
+	if (m->p_type == PT_DYNAMIC)
+	  break;
+
+      if (m == NULL)
+	{
       m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
       m->next = elf_tdata (abfd)->segment_map;
       elf_tdata (abfd)->segment_map = m;
     }
+    }
 
   /* Also call the generic arm routine.  */
   return elf32_arm_modify_segment_map (abfd, info);
Index: bfd/elf32-bfin.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-bfin.c,v
retrieving revision 1.13
diff -u -p -w -r1.13 elf32-bfin.c
--- bfd/elf32-bfin.c	1 Jun 2006 03:45:58 -0000	1.13
+++ bfd/elf32-bfin.c	20 Jun 2006 00:52:53 -0000
@@ -4234,10 +4234,13 @@ elf32_bfinfdpic_modify_segment_map (bfd 
 	  /* Add the stack section to the PT_GNU_STACK segment,
 	     such that its size and alignment requirements make it
 	     to the segment.  */
+	  if (m->count == 0)
+	    {
 	  m->sections[m->count] = sec;
 	  m->count++;
 	}
     }
+    }
 
   return TRUE;
 }
Index: bfd/elf32-frv.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-frv.c,v
retrieving revision 1.46
diff -u -p -w -r1.46 elf32-frv.c
--- bfd/elf32-frv.c	16 Mar 2006 12:20:15 -0000	1.46
+++ bfd/elf32-frv.c	20 Jun 2006 00:52:59 -0000
@@ -5757,10 +5757,13 @@ elf32_frvfdpic_modify_segment_map (bfd *
 	  /* Add the stack section to the PT_GNU_STACK segment,
 	     such that its size and alignment requirements make it
 	     to the segment.  */
+	  if (m->count == 0)
+	    {
 	  m->sections[m->count] = sec;
 	  m->count++;
 	}
     }
+    }
 
   return TRUE;
 }
Index: bfd/elf32-i370.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-i370.c,v
retrieving revision 1.53
diff -u -p -w -r1.53 elf32-i370.c
--- bfd/elf32-i370.c	19 Jun 2006 13:17:43 -0000	1.53
+++ bfd/elf32-i370.c	20 Jun 2006 00:52:59 -0000
@@ -1440,19 +1440,9 @@ i370_noop (void)
   return 1;
 }
 
-/* We need to define these at least as no-ops to link glibc ld.so.  */
-
-#define elf_backend_add_symbol_hook \
-  (bfd_boolean (*) \
-     (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, \
-      const char **, flagword *, asection **, bfd_vma *)) i370_noop
 #define elf_backend_finish_dynamic_symbol \
   (bfd_boolean (*) \
      (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, \
       Elf_Internal_Sym *)) i370_noop
-#define elf_backend_additional_program_headers \
-  (int (*) (bfd *, struct bfd_link_info *)) i370_noop
-#define elf_backend_modify_segment_map \
-  (bfd_boolean (*) (bfd *, struct bfd_link_info *)) i370_noop
 
 #include "elf32-target.h"
Index: bfd/elf64-hppa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-hppa.c,v
retrieving revision 1.72
diff -u -p -w -r1.72 elf64-hppa.c
--- bfd/elf64-hppa.c	19 Jun 2006 13:17:43 -0000	1.72
+++ bfd/elf64-hppa.c	20 Jun 2006 00:52:59 -0000
@@ -204,9 +204,6 @@ static bfd_boolean elf64_hppa_finish_dyn
   PARAMS ((bfd *, struct bfd_link_info *,
 	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
 
-static bfd_boolean elf64_hppa_modify_segment_map
-  PARAMS ((bfd *, struct bfd_link_info *));
-
 static enum elf_reloc_type_class elf64_hppa_reloc_type_class
   PARAMS ((const Elf_Internal_Rela *));
 
@@ -2641,9 +2638,8 @@ elf64_hppa_additional_program_headers (b
    existence of a .interp section.  */
 
 static bfd_boolean
-elf64_hppa_modify_segment_map (abfd, info)
-     bfd *abfd;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
+elf64_hppa_modify_segment_map (bfd *abfd,
+			       struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   struct elf_segment_map *m;
   asection *s;
Index: bfd/elfxx-ia64.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-ia64.c,v
retrieving revision 1.185
diff -u -p -w -r1.185 elfxx-ia64.c
--- bfd/elfxx-ia64.c	19 Jun 2006 13:17:43 -0000	1.185
+++ bfd/elfxx-ia64.c	20 Jun 2006 00:53:03 -0000
@@ -215,8 +215,6 @@ static bfd_boolean elfNN_ia64_add_symbol
   PARAMS ((bfd *abfd, struct bfd_link_info *info, Elf_Internal_Sym *sym,
 	   const char **namep, flagword *flagsp, asection **secp,
 	   bfd_vma *valp));
-static bfd_boolean elfNN_ia64_modify_segment_map
-  PARAMS ((bfd *, struct bfd_link_info *));
 static bfd_boolean elfNN_ia64_is_local_label_name
   PARAMS ((bfd *abfd, const char *name));
 static bfd_boolean elfNN_ia64_dynamic_symbol_p
@@ -1655,9 +1653,8 @@ elfNN_ia64_additional_program_headers (b
 }
 
 static bfd_boolean
-elfNN_ia64_modify_segment_map (abfd, info)
-     bfd *abfd;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
+elfNN_ia64_modify_segment_map (bfd *abfd,
+			       struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   struct elf_segment_map *m, **pm;
   Elf_Internal_Shdr *hdr;
Index: bfd/elfxx-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
retrieving revision 1.173
diff -u -p -w -r1.173 elfxx-mips.c
--- bfd/elfxx-mips.c	19 Jun 2006 13:17:43 -0000	1.173
+++ bfd/elfxx-mips.c	20 Jun 2006 00:53:09 -0000
@@ -9230,6 +9230,8 @@ _bfd_mips_elf_modify_segment_map (bfd *a
 		     || (*pm)->p_type == PT_INTERP))
 	    pm = &(*pm)->next;
 
+	  if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
+	    {
 	  amt = sizeof (struct elf_segment_map);
 	  options_segment = bfd_zalloc (abfd, amt);
 	  options_segment->next = *pm;
@@ -9241,6 +9243,7 @@ _bfd_mips_elf_modify_segment_map (bfd *a
 	  *pm = options_segment;
 	}
     }
+    }
   else
     {
       if (IRIX_COMPAT (abfd) == ict_irix5)
Index: bfd/doc/bfdint.texi
===================================================================
RCS file: /cvs/src/src/bfd/doc/bfdint.texi,v
retrieving revision 1.17
diff -u -p -w -r1.17 bfdint.texi
--- bfd/doc/bfdint.texi	3 Mar 2005 11:41:02 -0000	1.17
+++ bfd/doc/bfdint.texi	20 Jun 2006 00:53:14 -0000
@@ -1744,23 +1744,6 @@ support.
 The processor function hooks and constants are ad hoc and need better
 documentation.
 
-When a linker script uses @samp{SIZEOF_HEADERS}, the ELF backend must
-guess at the number of program segments which will be required, in
-@samp{get_program_header_size}.  This is because the linker calls
-@samp{bfd_sizeof_headers} before it knows all the section addresses and
-sizes.  The ELF backend may later discover, when creating program
-segments, that more program segments are required.  This is currently
-reported as an error in @samp{assign_file_positions_for_segments}.
-
-In practice this makes it difficult to use @samp{SIZEOF_HEADERS} except
-with a carefully defined linker script.  Unfortunately,
-@samp{SIZEOF_HEADERS} is required for fast program loading on a native
-system, since it permits the initial code section to appear on the same
-page as the program segments, saving a page read when the program starts
-running.  Fortunately, native systems permit careful definition of the
-linker script.  Still, ideally it would be possible to use relaxation to
-compute the number of program segments.
-
 @node BFD glossary
 @section BFD glossary
 @cindex glossary for bfd
Index: ld/Makefile.am
===================================================================
RCS file: /cvs/src/src/ld/Makefile.am,v
retrieving revision 1.213
diff -u -p -w -r1.213 Makefile.am
--- ld/Makefile.am	2 Jun 2006 23:08:12 -0000	1.213
+++ ld/Makefile.am	20 Jun 2006 00:53:46 -0000
@@ -475,6 +475,7 @@ stringify.sed: ${srcdir}/emultempl/$(STR
 
 GENSCRIPTS = LIB_PATH='${LIB_PATH}' $(SHELL) $(srcdir)/genscripts.sh "${srcdir}" "${libdir}" "${prefix}" "${exec_prefix}" @host@ @target@ @target_alias@ "@EMULATION_LIBPATH@" "@NATIVE_LIB_DIRS@" @use_sysroot@
 GEN_DEPENDS = $(srcdir)/genscripts.sh stringify.sed
+ELF_DEPS = $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/elf-generic.em
 
 @TDIRS@
 
@@ -493,56 +494,57 @@ eaixrs6.c: $(srcdir)/emulparams/aixrs6.s
 ealpha.c: $(srcdir)/emulparams/alpha.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/alpha.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} alpha "$(tdir_alpha)"
-earcelf.c: $(srcdir)/emulparams/arcelf.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+earcelf.c: $(srcdir)/emulparams/arcelf.sh $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} arcelf "$(tdir_arcelf)"
 earmelf.c: $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf "$(tdir_armelf)"
 earmelfb.c: $(srcdir)/emulparams/armelfb.sh $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelfb "$(tdir_armelfb)"
 earmelf_fbsd.c: $(srcdir)/emulparams/armelf_fbsd.sh \
   $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf_fbsd "$(tdir_armelf_fbsd)"
 earmelf_linux.c: $(srcdir)/emulparams/armelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf_linux "$(tdir_armelf_linux)"
 earmelf_linux_eabi.c: $(srcdir)/emulparams/armelf_linux_eabi.sh \
   $(srcdir)/emulparams/armelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf_linux_eabi "$(tdir_armelf_linux_abi)"
 earmelfb_linux.c: $(srcdir)/emulparams/armelfb_linux.sh \
   $(srcdir)/emulparams/armelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelfb_linux "$(tdir_armelfb_linux)"
 earmelfb_linux_eabi.c: $(srcdir)/emulparams/armelfb_linux_eabi.sh \
   $(srcdir)/emulparams/armelf_linux_eabi.sh \
   $(srcdir)/emulparams/armelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelfb_linux_eabi "$(tdir_armelfb_linux_abi)"
 earmelf_nbsd.c: $(srcdir)/emulparams/armelf_nbsd.sh \
   $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf_nbsd "$(tdir_armelf_nbsd)"
 earmelfb_nbsd.c: $(srcdir)/emulparams/armelfb_nbsd.sh \
   $(srcdir)/emulparams/armelf_nbsd.sh \
   $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armelfb_nbsd "$(tdir_armelfb_nbsd)"
 earmelf_vxworks.c: $(srcdir)/emulparams/armelf_vxworks.sh \
   $(srcdir)/emulparams/vxworks.sh $(srcdir)/emulparams/armelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/vxworks.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/vxworks.em \
   $(srcdir)/emultempl/armelf.em $(srcdir)/scripttempl/elf.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} armelf_vxworks "$(tdir_armelf)"
@@ -559,7 +561,7 @@ earmnbsd.c:	$(srcdir)/emulparams/armnbsd
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armnbsd "$(tdir_armnbsd)"
 earmnto.c: $(srcdir)/emulparams/armnto.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/armelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/armelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armnto "$(tdir_armnto)"
 earm_epoc_pe.c: $(srcdir)/emulparams/arm_epoc_pe.sh \
@@ -569,32 +571,32 @@ earmpe.c: $(srcdir)/emulparams/armpe.sh 
   $(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} armpe "$(tdir_armpe)"
 earmsymbian.c: $(srcdir)/emulparams/armsymbian.sh \
-  $(srcdir)/emulparams/armelf.sh $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emulparams/armelf.sh $(ELF_DEPS) \
   $(srcdir)/emultempl/armelf.em $(srcdir)/scripttempl/armbpabi.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} armsymbian "$(tdir_armelf)"
-eavr2.c: $(srcdir)/emulparams/avr2.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr2.c: $(srcdir)/emulparams/avr2.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr2 "$(tdir_avr2)"
-eavr1.c: $(srcdir)/emulparams/avr1.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr1.c: $(srcdir)/emulparams/avr1.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr1 "$(tdir_avr2)"
-eavr3.c: $(srcdir)/emulparams/avr3.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr3.c: $(srcdir)/emulparams/avr3.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr3 "$(tdir_avr2)"
-eavr4.c: $(srcdir)/emulparams/avr4.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr4.c: $(srcdir)/emulparams/avr4.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr4 "$(tdir_avr2)"
-eavr5.c: $(srcdir)/emulparams/avr5.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr5.c: $(srcdir)/emulparams/avr5.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr5 "$(tdir_avr2)"
-eavr6.c: $(srcdir)/emulparams/avr6.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
+eavr6.c: $(srcdir)/emulparams/avr6.sh $(srcdir)/emultempl/avrelf.em \
+  $(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} avr6 "$(tdir_avr2)"
 ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
@@ -607,332 +609,354 @@ ecrisaout.c: $(srcdir)/emulparams/crisao
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/crisaout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} crisaout "$(tdir_cris)"
 ecriself.c: $(srcdir)/emulparams/criself.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} criself "$(tdir_cris)"
 ecrislinux.c: $(srcdir)/emulparams/crislinux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} crislinux "$(tdir_cris)"
 ed10velf.c: $(srcdir)/emulparams/d10velf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elfd10v.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elfd10v.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} d10velf "$(tdir_d10v)"
-ed30velf.c: $(srcdir)/emulparams/d30velf.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
+ed30velf.c: $(srcdir)/emulparams/d30velf.sh $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em \
+  $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} d30velf "$(tdir_d30v)"
-ed30v_o.c: $(srcdir)/emulparams/d30v_o.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
+ed30v_o.c: $(srcdir)/emulparams/d30v_o.sh $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em \
+  $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} d30v_o "$(tdir_d30v)"
-ed30v_e.c: $(srcdir)/emulparams/d30v_e.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
+ed30v_e.c: $(srcdir)/emulparams/d30v_e.sh $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em \
+  $(srcdir)/scripttempl/elfd30v.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} d30v_e "$(tdir_d30v)"
 edelta68.c: $(srcdir)/emulparams/delta68.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/delta68.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} delta68 "$(tdir_delta68)"
 eelf32bfin.c: $(srcdir)/emulparams/bfin.sh \
-  $(srcdir)/emultempl/elf32.em \
+  $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfin "$(tdir_elf32bfin)" bfin
 eelf32bfinfd.c: $(srcdir)/emulparams/elf32bfinfd.sh $(srcdir)/emulparams/bfin.sh \
-  $(srcdir)/emultempl/elf32.em \
+  $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfinfd "$(tdir_elf32bfinfd)" elf32bfinfd
 eelf32_dlx.c: $(srcdir)/emulparams/elf32_dlx.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/dlx.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/dlx.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32_dlx "$(tdir_elf32_dlx)"
 eelf32xc16x.c: $(srcdir)/emulparams/elf32xc16x.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32xc16x "$(tdir_xc16x)"
 eelf32xc16xl.c: $(srcdir)/emulparams/elf32xc16xl.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32xc16xl "$(tdir_xc16xl)"
 eelf32xc16xs.c: $(srcdir)/emulparams/elf32xc16xs.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32xc16xs "$(tdir_xc16xs)"		
 eelf32xstormy16.c: $(srcdir)/emulparams/elf32xstormy16.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/xstormy16.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32xstormy16 "$(tdir_xstormy16)"
 eelf32am33lin.c: $(srcdir)/emulparams/elf32am33lin.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32am33lin "$(tdir_mn10300)"
 eelf32vax.c: $(srcdir)/emulparams/elf32vax.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32vax "$(tdir_elf32vax)"
 eelf32xtensa.c: $(srcdir)/emulparams/elf32xtensa.sh \
-  $(srcdir)/emulparams/xtensa-config.sh $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emulparams/xtensa-config.sh $(ELF_DEPS) \
   $(srcdir)/emultempl/xtensaelf.em $(INCDIR)/xtensa-config.h \
   $(BFDDIR)/elf-bfd.h $(BFDDIR)/libbfd.h $(INCDIR)/elf/xtensa.h \
   $(srcdir)/scripttempl/elfxtensa.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32xtensa "$(tdir_elf32xtensa)"
 eelf32fr30.c: $(srcdir)/emulparams/elf32fr30.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32fr30 "$(tdir_fr30)"
 eelf32frv.c: $(srcdir)/emulparams/elf32frv.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32frv "$(tdir_frv)"
+eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
+  $(srcdir)/emulparams/elf32frv.sh \
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+	${GENSCRIPTS} elf32frvfd "$(tdir_frv)"
 eelf32mcore.c: $(srcdir)/emulparams/elf32mcore.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32mcore "$(tdir_mcore)"
 em32relf.c: $(srcdir)/emulparams/m32relf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m32relf "$(tdir_m32r)"
 em32rlelf.c: $(srcdir)/emulparams/m32rlelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m32rlelf "$(tdir_m32rlelf)"
 em32relf_linux.c: $(srcdir)/emulparams/m32relf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m32relf_linux "$(tdir_m32relf_linux)"
 em32rlelf_linux.c: $(srcdir)/emulparams/m32rlelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m32rlelf_linux "$(tdir_m32rlelf_linux)"
 eelf32_sparc.c: $(srcdir)/emulparams/elf32_sparc.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32_sparc "$(tdir_elf32_sparc)"
 eelf32_sparc_vxworks.c: $(srcdir)/emulparams/elf32_sparc_vxworks.sh \
   $(srcdir)/emulparams/vxworks.sh $(srcdir)/emulparams/elf32_sparc.sh \
-  $(srcdir)/emultempl/vxworks.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/vxworks.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32_sparc_vxworks "$(tdir_elf32_sparc_vxworks)"
 eelf32_i860.c: $(srcdir)/emulparams/elf32_i860.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32_i860 "$(tdir_elf32_i860)"
 eelf32_i960.c: $(srcdir)/emulparams/elf32_i960.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32_i960 "$(tdir_elf32_i960)"
 eelf32b4300.c: $(srcdir)/emulparams/elf32b4300.sh \
   $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32b4300 "$(tdir_elf32b4300)"
 eelf32cr16c.c: $(srcdir)/emulparams/elf32cr16c.sh \
-  $(srcdir)/emultempl/elf32.em \
+  $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf32cr16c.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32cr16c "$(tdir_elf32cr16c)"
 eelf32bmip.c: $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bmip "$(tdir_elf32bmip)"
 eelf32bsmip.c: $(srcdir)/emulparams/elf32bsmip.sh \
   $(srcdir)/emulparams/elf32bmip.sh $(srcdir)/emultempl/irix.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bsmip "$(tdir_elf32bsmip)"
 eelf32btsmip.c: $(srcdir)/emulparams/elf32btsmip.sh \
   $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32btsmip "$(tdir_elf32btsmip)"
 eelf32crx.c: $(srcdir)/emulparams/elf32crx.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/crxelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/crxelf.em \
   $(srcdir)/scripttempl/elf32crx.sc ${GEN_DEPENDS} 
 	${GENSCRIPTS} elf32crx "$(tdir_elf32crx)"
 eelf32btsmipn32.c: $(srcdir)/emulparams/elf32btsmipn32.sh \
   $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32btsmipn32 "$(tdir_elf32btsmipn32)"
 eelf32ltsmip.c: $(srcdir)/emulparams/elf32ltsmip.sh \
   $(srcdir)/emulparams/elf32btsmip.sh $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ltsmip "$(tdir_elf32ltsmip)"
 eelf32ltsmipn32.c: $(srcdir)/emulparams/elf32ltsmipn32.sh \
   $(srcdir)/emulparams/elf32btsmip.sh $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ltsmipn32 "$(tdir_elf32ltsmipn32)"
 eelf32ebmip.c: $(srcdir)/emulparams/elf32ebmip.sh \
   $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ebmip "$(tdir_elf32ebmip)"
 eelf32ebmipvxworks.c: $(srcdir)/emulparams/elf32ebmipvxworks.sh \
   $(srcdir)/emulparams/elf32ebmip.sh $(srcdir)/emulparams/vxworks.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/vxworks.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/vxworks.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ebmipvxworks "$(tdir_elf32ebmipvxworks)"
 eelf32elmip.c: $(srcdir)/emulparams/elf32elmip.sh \
   $(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32elmip "$(tdir_elf32elmip)"
 eelf32elmipvxworks.c: $(srcdir)/emulparams/elf32elmipvxworks.sh \
   $(srcdir)/emulparams/elf32elmip.sh $(srcdir)/emulparams/vxworks.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/vxworks.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/vxworks.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32elmipvxworks "$(tdir_elf32elmipvxworks)"
 eelf32bmipn32.c: $(srcdir)/emulparams/elf32bmipn32.sh \
   $(srcdir)/emultempl/irix.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bmipn32 "$(tdir_elf32bmipn32)"
 eelf32l4300.c: $(srcdir)/emulparams/elf32l4300.sh \
   $(srcdir)/emulparams/elf32b4300.sh $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32l4300 "$(tdir_elf32l4300)"
 eelf32lmip.c: $(srcdir)/emulparams/elf32lmip.sh \
   $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32lmip "$(tdir_elf32lmip)"
 eelf32mipswindiss.c: $(srcdir)/emulparams/elf32mipswindiss.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32mipswindiss "$(tdir_elf32mipswindiss)"
+eelf32m32c.c: $(srcdir)/emulparams/elf32m32c.sh \
+  $(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+	${GENSCRIPTS} elf32m32c "$(tdir_m32c)"
+eelf32mt.c: $(srcdir)/emulparams/elf32mt.sh \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+	${GENSCRIPTS} elf32mt "$(tdir_mt)"
 eelf32lppc.c: $(srcdir)/emulparams/elf32lppc.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emultempl/ppc32elf.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32lppc "$(tdir_elf32lppc)"
 eelf32lppcnto.c: $(srcdir)/emulparams/elf32lppcnto.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emulparams/elf32ppccommon.sh \
-  $(srcdir)/emultempl/ppc32elf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/ppc32elf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32lppcnto "$(tdir_elf32lppcnto)"
 eelf32lppcsim.c: $(srcdir)/emulparams/elf32lppcsim.sh \
   $(srcdir)/emulparams/elf32lppc.sh $(srcdir)/emulparams/elf32ppc.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh $(srcdir)/emultempl/ppc32elf.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32lppcsim "$(tdir_elf32lppcsim)"
 eelf32ppcnto.c: $(srcdir)/emulparams/elf32ppcnto.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emulparams/elf32ppccommon.sh \
-  $(srcdir)/emultempl/ppc32elf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/ppc32elf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppcnto "$(tdir_elf32ppcnto)"
 eelf32ppcwindiss.c: $(srcdir)/emulparams/elf32ppcwindiss.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppcwindiss "$(tdir_elf32ppcwindiss)"
 eelf32ppcvxworks.c: $(srcdir)/emulparams/elf32ppcvxworks.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh $(srcdir)/emulparams/vxworks.sh \
-  $(srcdir)/emultempl/vxworks.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/vxworks.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppcvxworks "$(tdir_elf32ppcvxworks)"
 eelf32lsmip.c: $(srcdir)/emulparams/elf32lsmip.sh \
   $(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32lsmip "$(tdir_elf32lsmip)"
 eelf32openrisc.c: $(srcdir)/emulparams/elf32openrisc.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32openrisc "$(tdir_openrisc)"
 eelf32ppc.c: $(srcdir)/emulparams/elf32ppc.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh $(srcdir)/emultempl/ppc32elf.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppc "$(tdir_elf32ppc)"
 eelf32ppc_fbsd.c: $(srcdir)/emulparams/elf32ppc_fbsd.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emulparams/elf32ppccommon.sh \
-  $(srcdir)/emultempl/ppc32elf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/ppc32elf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppc_fbsd "$(tdir_elf32ppc_fbsd)"
 eelf32ppcsim.c: $(srcdir)/emulparams/elf32ppcsim.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emulparams/elf32ppccommon.sh \
-  $(srcdir)/emultempl/ppc32elf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/ppc32elf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppcsim "$(tdir_elf32ppcsim)"
 eelf32ppclinux.c: $(srcdir)/emulparams/elf32ppclinux.sh \
   $(srcdir)/emulparams/elf32ppc.sh $(srcdir)/emulparams/elf32ppccommon.sh \
-  $(srcdir)/emultempl/ppc32elf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/ppc32elf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ppclinux "$(tdir_elf32ppclinux)"
 eelf64ppc.c: $(srcdir)/emulparams/elf64ppc.sh $(srcdir)/emultempl/ppc64elf.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64ppc "$(tdir_elf64ppc)"
 eelf64lppc.c: $(srcdir)/emulparams/elf64lppc.sh \
   $(srcdir)/emulparams/elf64ppc.sh $(srcdir)/emultempl/ppc64elf.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64lppc "$(tdir_elf64lppc)"
 eelf32i370.c: $(srcdir)/emulparams/elf32i370.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elfi370.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elfi370.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32i370 "$(tdir_elf32i370)"
 eelf32ip2k.c: $(srcdir)/emulparams/elf32ip2k.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/ip2k.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/ip2k.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32ip2k "$(tdir_ip2k)"
 eelf32iq2000.c: $(srcdir)/emulparams/elf32iq2000.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/iq2000.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/iq2000.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32iq2000 "$(tdir_iq2000)"
 eelf32iq10.c: $(srcdir)/emulparams/elf32iq10.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/iq2000.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/iq2000.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32iq10 "$(tdir_iq10)"
 eelf64alpha.c: $(srcdir)/emulparams/elf64alpha.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/alphaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/alphaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64alpha "$(tdir_elf64alpha)"
 eelf64alpha_fbsd.c: $(srcdir)/emulparams/elf64alpha_fbsd.sh \
   $(srcdir)/emulparams/elf64alpha.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/alphaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/alphaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64alpha_fbsd "$(tdir_elf64alpha_fbsd)"
 eelf64alpha_nbsd.c: $(srcdir)/emulparams/elf64alpha_nbsd.sh \
   $(srcdir)/emulparams/elf64alpha.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/alphaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/alphaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64alpha_nbsd "$(tdir_elf64alpha_nbsd)"
 eelf64hppa.c: $(srcdir)/emulparams/elf64hppa.sh \
   $(srcdir)/emulparams/hppa64linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64hppa "$(tdir_elf64hppa)"
 eelf64_aix.c: $(srcdir)/emulparams/elf64_aix.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_aix "$(tdir_elf64_aix)"
 eelf64_ia64.c: $(srcdir)/emulparams/elf64_ia64.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/ia64elf.em \
   $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_ia64 "$(tdir_elf64_ia64)"
 eelf64_ia64_fbsd.c: $(srcdir)/emulparams/elf64_ia64_fbsd.sh \
   $(srcdir)/emulparams/elf64_ia64.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/ia64elf.em \
   $(srcdir)/emultempl/needrelax.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_ia64_fbsd "$(tdir_elf64_ia64_fbsd)"
 eelf64_s390.c: $(srcdir)/emulparams/elf64_s390.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_s390 "$(tdir_elf64_s390)"
 eelf64_sparc.c: $(srcdir)/emulparams/elf64_sparc.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_sparc "$(tdir_elf64_sparc)"
 eelf64_sparc_fbsd.c: $(srcdir)/emulparams/elf64_sparc_fbsd.sh \
   $(srcdir)/emulparams/elf64_sparc.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64_sparc_fbsd "$(tdir_elf64_sparc_fbsd)"
 eelf64bmip.c: $(srcdir)/emulparams/elf64bmip.sh \
   $(srcdir)/emulparams/elf32bmipn32.sh $(srcdir)/emultempl/irix.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64bmip "$(tdir_elf64bmip)"
 eelf64mmix.c: $(srcdir)/emulparams/elf64mmix.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/mmix-elfnmmo.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/mmix-elfnmmo.em \
   $(srcdir)/emultempl/mmixelf.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64mmix "$(tdir_elf64mmix)"
 emmo.c: $(srcdir)/emulparams/mmo.sh $(srcdir)/emultempl/mmix-elfnmmo.em \
-  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/mmo.em \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em \
+  $(srcdir)/emultempl/mmo.em \
   $(srcdir)/scripttempl/mmo.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} mmo "$(tdir_mmo)"
 eelf64btsmip.c: $(srcdir)/emulparams/elf64btsmip.sh \
   $(srcdir)/emulparams/elf32bmipn32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64btsmip "$(tdir_elf64btsmip)"
 eelf64ltsmip.c: $(srcdir)/emulparams/elf64ltsmip.sh \
   $(srcdir)/emulparams/elf64btsmip.sh $(srcdir)/emulparams/elf32bmipn32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf64ltsmip "$(tdir_elf64ltsmip)"
 eelf_i386.c: $(srcdir)/emulparams/elf_i386.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386 "$(tdir_elf_i386)"
 eelf_x86_64.c: $(srcdir)/emulparams/elf_x86_64.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_x86_64 "$(tdir_elf_x86_64)"
 eelf_x86_64_fbsd.c: $(srcdir)/emulparams/elf_x86_64_fbsd.sh \
   $(srcdir)/emulparams/elf_x86_64.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_x86_64_fbsd "$(tdir_elf_x86_64_fbsd)"
 eelf_i386_be.c: $(srcdir)/emulparams/elf_i386_be.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386_be "$(tdir_elf_i386_be)"
 eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)"
 eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \
   $(srcdir)/emulparams/elf_i386.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386_fbsd "$(tdir_elf_i386_fbsd)"
 eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
 eelf_i386_vxworks.c: $(srcdir)/emulparams/elf_i386_vxworks.sh \
   $(srcdir)/emulparams/vxworks.sh $(srcdir)/emultempl/vxworks.em \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_i386_vxworks "$(tdir_elf_i386_vxworks)"
 eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)"
 egld960.c: $(srcdir)/emulparams/gld960.sh \
   $(srcdir)/emultempl/gld960.em $(srcdir)/scripttempl/i960.sc ${GEN_DEPENDS}
@@ -962,31 +986,31 @@ eh8300sxn.c: $(srcdir)/emulparams/h8300s
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/h8300sxn.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300sxn "$(tdir_h8300sxn)"
 eh8300elf.c: $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300elf "$(tdir_h8300elf)"
 eh8300helf.c: $(srcdir)/emulparams/h8300helf.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300helf "$(tdir_h8300helf)"
 eh8300self.c: $(srcdir)/emulparams/h8300self.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300self "$(tdir_h8300self)"
 eh8300hnelf.c: $(srcdir)/emulparams/h8300hnelf.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300hnelf "$(tdir_h8300hnelf)"
 eh8300snelf.c: $(srcdir)/emulparams/h8300snelf.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300snelf "$(tdir_h8300snelf)"
 eh8300sxelf.c: $(srcdir)/emulparams/h8300sxelf.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300sxelf "$(tdir_h8300sxelf)"
 eh8300sxnelf.c: $(srcdir)/emulparams/h8300sxnelf.sh \
   $(srcdir)/emulparams/h8300elf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} h8300sxnelf "$(tdir_h8300sxnelf)"
 eh8500.c: $(srcdir)/emulparams/h8500.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/h8500.sc ${GEN_DEPENDS}
@@ -1010,24 +1034,24 @@ ehp3hpux.c: $(srcdir)/emulparams/hp3hpux
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hp3hpux "$(tdir_hp3hpux)"
 ehppaelf.c: $(srcdir)/emulparams/hppaelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/hppaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/hppaelf.em \
   $(srcdir)/scripttempl/hppaelf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hppaelf "$(tdir_hppaelf)"
 ehppalinux.c: $(srcdir)/emulparams/hppalinux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/hppaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/hppaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hppalinux "$(tdir_hppalinux)"
 ehppanbsd.c: $(srcdir)/emulparams/hppanbsd.sh \
   $(srcdir)/emulparams/hppaelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/hppaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/hppaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hppanbsd "$(tdir_hppanbsd)"
 ehppaobsd.c: $(srcdir)/emulparams/hppaobsd.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/hppaelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/hppaelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hppaobsd "$(tdir_hppaobsd)"
 ehppa64linux.c: $(srcdir)/emulparams/hppa64linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} hppa64linux "$(tdir_hppa64linux)"
 ei386aout.c: $(srcdir)/emulparams/i386aout.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
@@ -1048,13 +1072,13 @@ ei386linux.c: $(srcdir)/emulparams/i386l
   $(srcdir)/emultempl/linux.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386linux "$(tdir_i386linux)"
 ei386lynx.c: $(srcdir)/emulparams/i386lynx.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386lynx "$(tdir_i386lynx)"
 ei386mach.c: $(srcdir)/emulparams/i386mach.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386mach "$(tdir_i386mach)"
 ei386moss.c: $(srcdir)/emulparams/i386moss.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386moss "$(tdir_i386moss)"
 ei386msdos.c: $(srcdir)/emulparams/i386msdos.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i386msdos.sc ${GEN_DEPENDS}
@@ -1063,10 +1087,10 @@ ei386nbsd.c:	$(srcdir)/emulparams/i386nb
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386nbsd "$(tdir_i386nbsd)"
 ei386nto.c:	$(srcdir)/emulparams/i386nto.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386nto "$(tdir_i386nto)"
 ei386nw.c:	$(srcdir)/emulparams/i386nw.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/nw.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/nw.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} i386nw "$(tdir_i386nw)"
 ei386pe.c: $(srcdir)/emulparams/i386pe.sh \
   $(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
@@ -1078,19 +1102,19 @@ elnk960.c: $(srcdir)/emulparams/lnk960.s
   $(srcdir)/emultempl/lnk960.em $(srcdir)/scripttempl/i960.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} lnk960 "$(tdir_lnk960)"
 em68hc11elf.c: $(srcdir)/emulparams/m68hc11elf.sh \
-  $(srcdir)/emultempl/m68hc1xelf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/m68hc1xelf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elfm68hc11.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68hc11elf "$(tdir_m68hc11)"
 em68hc11elfb.c: $(srcdir)/emulparams/m68hc11elfb.sh \
-  $(srcdir)/emultempl/m68hc1xelf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/m68hc1xelf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elfm68hc11.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68hc11elfb "$(tdir_m68hc11b)"
 em68hc12elf.c: $(srcdir)/emulparams/m68hc12elf.sh \
-  $(srcdir)/emultempl/m68hc1xelf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/m68hc1xelf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elfm68hc12.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68hc12elf "$(tdir_m68hc12)"
 em68hc12elfb.c: $(srcdir)/emulparams/m68hc12elfb.sh \
-  $(srcdir)/emultempl/m68hc1xelf.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/emultempl/m68hc1xelf.em $(ELF_DEPS) \
   $(srcdir)/scripttempl/elfm68hc12.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68hc12elfb "$(tdir_m68hc12b)"
 em68k4knbsd.c:	$(srcdir)/emulparams/m68k4knbsd.sh \
@@ -1106,12 +1130,12 @@ em68kcoff.c: $(srcdir)/emulparams/m68kco
   $(srcdir)/emultempl/m68kcoff.em $(srcdir)/scripttempl/m68kcoff.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68kcoff "$(tdir_m68kcoff)"
 em68kelf.c: $(srcdir)/emulparams/m68kelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/m68kelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/m68kelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68kelf "$(tdir_m68kelf)"
 em68kelfnbsd.c: $(srcdir)/emulparams/m68kelfnbsd.sh \
   $(srcdir)/emulparams/m68kelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/m68kelf.em \
+  $(ELF_DEPS) $(srcdir)/emultempl/m68kelf.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68kelfnbsd "$(tdir_m68kelfnbsd)"
 em68klinux.c: $(srcdir)/emulparams/m68klinux.sh \
@@ -1121,7 +1145,7 @@ em68knbsd.c:	$(srcdir)/emulparams/m68knb
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68knbsd "$(tdir_m68knbsd)"
 em68kpsos.c:	$(srcdir)/emulparams/m68kpsos.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/psos.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/psos.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} m68kpsos "$(tdir_m68kpsos)"
 em88kbcs.c: $(srcdir)/emulparams/m88kbcs.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/m88kbcs.sc ${GEN_DEPENDS}
@@ -1157,245 +1181,305 @@ emipspe.c: $(srcdir)/emulparams/mipspe.s
 	${GENSCRIPTS} mipspe "$(tdir_mips)"
 emn10300.c: $(srcdir)/emulparams/mn10300.sh \
   $(srcdir)/emulparams/mn10200.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} mn10300 "$(tdir_mn10300)"
 emn10200.c: $(srcdir)/emulparams/mn10200.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} mn10200 "$(tdir_mn10200)"
 emsp430x110.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x110 "$(tdir_msp430x110)" msp430all
 emsp430x112.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x112 "$(tdir_msp430x112)" msp430all
 emsp430x1101.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1101 "$(tdir_msp430x1101)" msp430all
 emsp430x1111.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1111 "$(tdir_msp430x1111)" msp430all
 emsp430x1121.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1121 "$(tdir_msp430x1121)" msp430all
 emsp430x1122.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1122 "$(tdir_msp430x1122)" msp430all
 emsp430x1132.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1132 "$(tdir_msp430x1132)" msp430all
 emsp430x122.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x122 "$(tdir_msp430x122)" msp430all
 emsp430x123.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x123 "$(tdir_msp430x123)" msp430all
 emsp430x1222.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1222 "$(tdir_msp430x1222)" msp430all
 emsp430x1232.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1232 "$(tdir_msp430x1232)" msp430all
 emsp430x133.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x133 "$(tdir_msp430x133)" msp430all
 emsp430x135.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x135 "$(tdir_msp430x135)" msp430all
 emsp430x1331.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1331 "$(tdir_msp430x1331)" msp430all
 emsp430x1351.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1351 "$(tdir_msp430x1351)" msp430all
 emsp430x147.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x147 "$(tdir_msp430x147)" msp430all
 emsp430x148.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x148 "$(tdir_msp430x148)" msp430all
 emsp430x149.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x149 "$(tdir_msp430x149)" msp430all
 emsp430x155.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x155 "$(tdir_msp430x155)" msp430all
 emsp430x156.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x156 "$(tdir_msp430x156)" msp430all
 emsp430x157.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x157 "$(tdir_msp430x157)" msp430all
 emsp430x167.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x167 "$(tdir_msp430x167)" msp430all
 emsp430x168.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x168 "$(tdir_msp430x168)" msp430all
 emsp430x169.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x169 "$(tdir_msp430x169)" msp430all
 emsp430x1610.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1610 "$(tdir_msp430x1610)" msp430all
 emsp430x1611.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1611 "$(tdir_msp430x1611)" msp430all
 emsp430x1612.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x1612 "$(tdir_msp430x1612)" msp430all
 emsp430x2101.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x2101 "$(tdir_msp430x2101)" msp430all
 emsp430x2111.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x2111 "$(tdir_msp430x2111)" msp430all
 emsp430x2121.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x2121 "$(tdir_msp430x2121)" msp430all
 emsp430x2131.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x2131 "$(tdir_msp430x2131)" msp430all
 emsp430x311.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x311 "$(tdir_msp430x311)" msp430all
 emsp430x312.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x312 "$(tdir_msp430x312)" msp430all
 emsp430x313.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x313 "$(tdir_msp430x313)" msp430all
 emsp430x314.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x314 "$(tdir_msp430x314)" msp430all
 emsp430x315.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x315 "$(tdir_msp430x315)" msp430all
 emsp430x323.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x323 "$(tdir_msp430x323)" msp430all
 emsp430x325.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x325 "$(tdir_msp430x325)" msp430all
 emsp430x336.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x336 "$(tdir_msp430x336)" msp430all
 emsp430x337.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430_3.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430_3.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x337 "$(tdir_msp430x337)" msp430all
 emsp430x412.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x412 "$(tdir_msp430x412)" msp430all
 emsp430x413.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x413 "$(tdir_msp430x413)" msp430all
 emsp430x415.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x415 "$(tdir_msp430x415)" msp430all
 emsp430x417.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x417 "$(tdir_msp430x417)" msp430all
 emsp430xE423.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xE423 "$(tdir_msp430xE423)" msp430all
 emsp430xE425.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xE425 "$(tdir_msp430xE425)" msp430all
 emsp430xE427.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xE427 "$(tdir_msp430xE427)" msp430all
 emsp430xW423.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xW423 "$(tdir_msp430xW423)" msp430all
 emsp430xW425.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xW425 "$(tdir_msp430xW425)" msp430all
 emsp430xW427.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xW427 "$(tdir_msp430xW427)" msp430all
 emsp430xG437.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xG437 "$(tdir_msp430xG437)" msp430all
 emsp430xG438.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xG438 "$(tdir_msp430xG438)" msp430all
 emsp430xG439.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430xG439 "$(tdir_msp430xG439)" msp430all
 emsp430x435.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x435 "$(tdir_msp430x435)" msp430all
 emsp430x436.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x436 "$(tdir_msp430x436)" msp430all
 emsp430x437.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x437 "$(tdir_msp430x437)" msp430all
 emsp430x447.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x447 "$(tdir_msp430x447)" msp430all
 emsp430x448.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x448 "$(tdir_msp430x448)" msp430all
 emsp430x449.c: $(srcdir)/emulparams/msp430all.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32msp430.sc \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf32msp430.sc \
   ${GEN_DEPENDS}
 	${GENSCRIPTS} msp430x449 "$(tdir_msp430x449)" msp430all
 enews.c: $(srcdir)/emulparams/news.sh \
@@ -1409,7 +1493,8 @@ eor32.c: $(srcdir)/emulparams/or32.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/or32.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} or32 "$(tdir_or32)"
 eor32elf.c: $(srcdir)/emulparams/or32elf.sh \
-  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} or32elf "$(tdir_or32elf)"
 epc532macha.c: $(srcdir)/emulparams/pc532macha.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
@@ -1418,22 +1503,24 @@ epdp11.c: $(srcdir)/emulparams/pdp11.sh 
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} pdp11 "$(tdir_pdp11)"
 epjelf.c: $(srcdir)/emulparams/pjelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} pjelf "$(tdir_pjelf)"
-epjlelf.c: $(srcdir)/emulparams/pjlelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+epjlelf.c: $(srcdir)/emulparams/pjlelf.sh $(srcdir)/emulparams/pjelf.sh \
+  $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/genelf.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} pjlelf "$(tdir_pjlelf)"
 eppcmacos.c:	$(srcdir)/emulparams/ppcmacos.sh \
   $(srcdir)/emultempl/aix.em $(srcdir)/scripttempl/aix.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} ppcmacos "$(tdir_ppcmacos)"
 eppcnw.c:	$(srcdir)/emulparams/ppcnw.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/nw.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/nw.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} ppcnw "$(tdir_ppcnw)"
 eppcpe.c: $(srcdir)/emulparams/ppcpe.sh \
   $(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/ppcpe.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} ppcpe "$(tdir_ppcpe)"
 eppclynx.c: $(srcdir)/emulparams/ppclynx.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} ppclynx "$(tdir_ppclynx)"
 eriscix.c: $(srcdir)/emulparams/riscix.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
@@ -1442,87 +1529,87 @@ esh.c: $(srcdir)/emulparams/sh.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/sh.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} sh "$(tdir_sh)"
 eshelf.c: $(srcdir)/emulparams/shelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf "$(tdir_shelf)"
 eshelf32.c: $(srcdir)/emulparams/shelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf32 "$(tdir_shelf32)"
 eshelf32_linux.c: $(srcdir)/emulparams/shelf32_linux.sh \
   $(srcdir)/emulparams/shelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf32_linux "$(tdir_shelf32_linux)"
 eshelf32_nbsd.c: $(srcdir)/emulparams/shelf32_nbsd.sh \
   $(srcdir)/emulparams/shelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf32_nbsd "$(tdir_shelf32_nbsd)"
 eshelf64.c: $(srcdir)/emulparams/shelf64.sh $(srcdir)/emulparams/shelf32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf64 "$(tdir_shelf64)"
 eshelf64_nbsd.c: $(srcdir)/emulparams/shelf64_nbsd.sh \
   $(srcdir)/emulparams/shelf32_nbsd.sh $(srcdir)/emulparams/shelf32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf64_nbsd "$(tdir_shelf64_nbsd)"
 eshelf_linux.c: $(srcdir)/emulparams/shelf_linux.sh \
   $(srcdir)/emulparams/shlelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf_linux "$(tdir_shelf_linux)"
 eshlelf_linux.c: $(srcdir)/emulparams/shlelf_linux.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf_linux "$(tdir_shlelf_linux)"
 eshelf_nbsd.c: $(srcdir)/emulparams/shelf_nbsd.sh \
   $(srcdir)/emulparams/shelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf_nbsd "$(tdir_shelf_nbsd)"
 eshelf_nto.c: $(srcdir)/emulparams/shelf_nto.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shelf_nto "$(tdir_shelf_nto)"
 eshlelf_nbsd.c: $(srcdir)/emulparams/shlelf_nbsd.sh \
   $(srcdir)/emulparams/shelf_nbsd.sh \
   $(srcdir)/emulparams/shelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf_nbsd "$(tdir_shlelf_nbsd)"
 eshlelf_nto.c: $(srcdir)/emulparams/shlelf_nto.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf_nto "$(tdir_shlelf_nto)"
 eshlelf.c: $(srcdir)/emulparams/shlelf.sh \
   $(srcdir)/emulparams/shelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf "$(tdir_shlelf)"
 eshlsymbian.c: $(srcdir)/emulparams/shlsymbian.sh \
   $(srcdir)/emulparams/shelf.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf32sh-symbian.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf32sh-symbian.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlsymbian "$(tdir_shlelf)"
 eshlelf32.c: $(srcdir)/emulparams/shlelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h $(srcdir)/emulparams/shelf32.sh \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf32 "$(tdir_shlelf32)"
 eshlelf32_linux.c: $(srcdir)/emulparams/shlelf32_linux.sh \
   $(srcdir)/emulparams/shelf32_linux.sh $(srcdir)/emulparams/shelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf32_linux "$(tdir_shlelf32_linux)"
 eshlelf32_nbsd.c: $(srcdir)/emulparams/shlelf32_nbsd.sh \
   $(srcdir)/emulparams/shelf32_nbsd.sh $(srcdir)/emulparams/shelf32.sh \
   $(BFDDIR)/libbfd.h $(INCDIR)/libiberty.h \
   $(srcdir)/emultempl/sh64elf.em $(INCDIR)/elf/sh.h $(BFDDIR)/elf-bfd.h \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf32_nbsd "$(tdir_shlelf32_nbsd)"
 eshlelf64.c: $(srcdir)/emulparams/shlelf64.sh \
   $(srcdir)/emulparams/shelf64.sh $(srcdir)/emulparams/shelf32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf64 "$(tdir_shlelf64)"
 eshlelf64_nbsd.c: $(srcdir)/emulparams/shlelf64_nbsd.sh \
   $(srcdir)/emulparams/shelf64_nbsd.sh \
   $(srcdir)/emulparams/shelf32_nbsd.sh $(srcdir)/emulparams/shelf32.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} shlelf64_nbsd "$(tdir_shlelf64_nbsd)"
 eshl.c: $(srcdir)/emulparams/shl.sh \
   $(srcdir)/emulparams/sh.sh \
@@ -1583,7 +1670,7 @@ evsta.c: $(srcdir)/emulparams/vsta.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} vsta "$(tdir_vsta)"
 ev850.c: $(srcdir)/emulparams/v850.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
+  $(ELF_DEPS) $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} v850 "$(tdir_v850)"
 ew65.c: $(srcdir)/emulparams/w65.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/w65.sc ${GEN_DEPENDS}
@@ -1598,17 +1685,6 @@ ez8001.c: $(srcdir)/emulparams/z8001.sh 
 ez8002.c: $(srcdir)/emulparams/z8002.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/z8000.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} z8002 "$(tdir_z8002)"
-eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
-  $(srcdir)/emulparams/elf32frv.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
-	${GENSCRIPTS} elf32frvfd "$(tdir_frv)"
-eelf32m32c.c: $(srcdir)/emulparams/elf32m32c.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \
-  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
-	${GENSCRIPTS} elf32m32c "$(tdir_m32c)"
-eelf32mt.c: $(srcdir)/emulparams/elf32mt.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
-	${GENSCRIPTS} elf32mt "$(tdir_mt)"
 
 # We need this for automake to use YLWRAP.
 EXTRA_ld_new_SOURCES = deffilep.y
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.223
diff -u -p -w -r1.223 ldlang.c
--- ld/ldlang.c	9 Jun 2006 01:13:39 -0000	1.223
+++ ld/ldlang.c	20 Jun 2006 00:53:54 -0000
@@ -5568,13 +5568,13 @@ lang_process (void)
 
   lang_do_assignments ();
 
+  ldemul_finish ();
+
   /* Make sure that the section addresses make sense.  */
   if (! link_info.relocatable
       && command_line.check_section_addresses)
     lang_check_section_addresses ();
 
-  /* Final stuffs.  */
-  ldemul_finish ();
   lang_end ();
 }
 
Index: ld/emulparams/arcelf.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/arcelf.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 arcelf.sh
--- ld/emulparams/arcelf.sh	30 May 2006 16:45:32 -0000	1.2
+++ ld/emulparams/arcelf.sh	20 Jun 2006 00:53:54 -0000
@@ -1,4 +1,6 @@
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-littlearc"
 LITTLE_OUTPUT_FORMAT="elf32-littlearc"
 BIG_OUTPUT_FORMAT="elf32-bigarc"
@@ -8,4 +10,3 @@ NONPAGED_TEXT_START_ADDR=0x0
 ARCH=arc
 MACHINE=
 ENTRY=start
-#TEMPLATE_NAME=elf32
Index: ld/emulparams/d30v_e.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/d30v_e.sh,v
retrieving revision 1.1.1.1
diff -u -p -w -r1.1.1.1 d30v_e.sh
--- ld/emulparams/d30v_e.sh	3 May 1999 07:29:07 -0000	1.1.1.1
+++ ld/emulparams/d30v_e.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elfd30v
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-d30v"
 TEXT_START_ADDR=0x00000000
 DATA_START_ADDR=0x20000000
Index: ld/emulparams/d30v_o.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/d30v_o.sh,v
retrieving revision 1.1.1.1
diff -u -p -w -r1.1.1.1 d30v_o.sh
--- ld/emulparams/d30v_o.sh	3 May 1999 07:29:07 -0000	1.1.1.1
+++ ld/emulparams/d30v_o.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elfd30v
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-d30v"
 TEXT_START_ADDR=0x00000000
 DATA_START_ADDR=0x20000000
Index: ld/emulparams/d30velf.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/d30velf.sh,v
retrieving revision 1.1.1.1
diff -u -p -w -r1.1.1.1 d30velf.sh
--- ld/emulparams/d30velf.sh	3 May 1999 07:29:07 -0000	1.1.1.1
+++ ld/emulparams/d30velf.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elfd30v
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-d30v"
 TEXT_START_ADDR=0x00000000
 DATA_START_ADDR=0x20000000
Index: ld/emulparams/elf32_dlx.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32_dlx.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 elf32_dlx.sh
--- ld/emulparams/elf32_dlx.sh	13 Aug 2002 02:08:26 -0000	1.2
+++ ld/emulparams/elf32_dlx.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,6 @@
 SCRIPT_NAME=dlx
 TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-dlx"
 ARCH=dlx
 MACHINE=
Index: ld/emulparams/elf32_i860.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32_i860.sh,v
retrieving revision 1.3
diff -u -p -w -r1.3 elf32_i860.sh
--- ld/emulparams/elf32_i860.sh	30 May 2006 16:45:32 -0000	1.3
+++ ld/emulparams/elf32_i860.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 # A work in progress...
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-i860-little"
 BIG_OUTPUT_FORMAT="elf32-i860"
 LITTLE_OUTPUT_FORMAT="elf32-i860-little"
Index: ld/emulparams/elf32fr30.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32fr30.sh,v
retrieving revision 1.5
diff -u -p -w -r1.5 elf32fr30.sh
--- ld/emulparams/elf32fr30.sh	5 Aug 2005 04:29:56 -0000	1.5
+++ ld/emulparams/elf32fr30.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-fr30"
 TEXT_START_ADDR=0x10000
 ARCH=fr30
Index: ld/emulparams/elf32frv.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32frv.sh,v
retrieving revision 1.4
diff -u -p -w -r1.4 elf32frv.sh
--- ld/emulparams/elf32frv.sh	3 Aug 2005 05:09:49 -0000	1.4
+++ ld/emulparams/elf32frv.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-frv"
 TEXT_START_ADDR=0x10000
 ARCH=frv
Index: ld/emulparams/elf32frvfd.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32frvfd.sh,v
retrieving revision 1.5
diff -u -p -w -r1.5 elf32frvfd.sh
--- ld/emulparams/elf32frvfd.sh	30 May 2006 16:45:32 -0000	1.5
+++ ld/emulparams/elf32frvfd.sh	20 Jun 2006 00:53:54 -0000
@@ -3,6 +3,7 @@ unset STACK_ADDR
 OUTPUT_FORMAT="elf32-frvfdpic"
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEMPLATE_NAME=elf32
+unset EXTRA_EM_FILE
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 EMBEDDED= # This gets us program headers mapped as part of the text segment.
Index: ld/emulparams/elf32iq10.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32iq10.sh,v
retrieving revision 1.1
diff -u -p -w -r1.1 elf32iq10.sh
--- ld/emulparams/elf32iq10.sh	4 Jan 2003 02:04:43 -0000	1.1
+++ ld/emulparams/elf32iq10.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=iq2000
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-iq2000"
 DATA_ADDR=0x1000
 TEXT_START_ADDR=0x80000000
Index: ld/emulparams/elf32iq2000.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32iq2000.sh,v
retrieving revision 1.1
diff -u -p -w -r1.1 elf32iq2000.sh
--- ld/emulparams/elf32iq2000.sh	4 Jan 2003 02:04:43 -0000	1.1
+++ ld/emulparams/elf32iq2000.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=iq2000
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-iq2000"
 DATA_ADDR=0x1000
 TEXT_START_ADDR=0x80000000
Index: ld/emulparams/elf32mt.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32mt.sh,v
retrieving revision 1.3
diff -u -p -w -r1.3 elf32mt.sh
--- ld/emulparams/elf32mt.sh	16 Dec 2005 10:23:10 -0000	1.3
+++ ld/emulparams/elf32mt.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,7 @@
 MACHINE=
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-mt"
 # See also `include/elf/mt.h'
 TEXT_START_ADDR=0x2000
Index: ld/emulparams/mn10200.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/mn10200.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 mn10200.sh
--- ld/emulparams/mn10200.sh	22 Nov 2001 09:08:04 -0000	1.2
+++ ld/emulparams/mn10200.sh	20 Jun 2006 00:53:54 -0000
@@ -2,6 +2,8 @@
 # mn10300.sh
 
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-mn10200"
 TEXT_START_ADDR=0x0
 ARCH=mn10200
Index: ld/emulparams/mn10300.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/mn10300.sh,v
retrieving revision 1.3
diff -u -p -w -r1.3 mn10300.sh
--- ld/emulparams/mn10300.sh	10 Jul 2003 03:20:26 -0000	1.3
+++ ld/emulparams/mn10300.sh	20 Jun 2006 00:53:54 -0000
@@ -2,4 +2,5 @@
 OUTPUT_FORMAT="elf32-mn10300"
 ARCH=mn10300
 TEMPLATE_NAME=elf32
+unset EXTRA_EM_FILE
 GENERATE_SHLIB_SCRIPT=yes
Index: ld/emulparams/msp430all.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/msp430all.sh,v
retrieving revision 1.4
diff -u -p -w -r1.4 msp430all.sh
--- ld/emulparams/msp430all.sh	8 Aug 2005 17:08:04 -0000	1.4
+++ ld/emulparams/msp430all.sh	20 Jun 2006 00:53:54 -0000
@@ -4,1005 +4,550 @@
 
 MSP430_NAME=${EMULATION_NAME}
 
-if [ "${MSP430_NAME}" = "msp430x110" ] ; then
-ARCH=msp:11
-MACHINE=
 SCRIPT_NAME=elf32msp430
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-msp430"
+MACHINE=
 MAXPAGESIZE=1
 EMBEDDED=yes
-TEMPLATE_NAME=generic
 
+if [ "${MSP430_NAME}" = "msp430x110" ] ; then
+ARCH=msp:11
 ROM_START=0xfc00
 ROM_SIZE=0x3e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1101" ] ; then
 ARCH=msp:110
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xfc00
 ROM_SIZE=0x3e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1111" ] ; then
 ARCH=msp:110
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf800
 ROM_SIZE=0x07e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x112" ] ; then
 ARCH=msp:11
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0xfe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1121" ] ; then
 ARCH=msp:110
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0x0fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1122" ] ; then
 ARCH=msp:110
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0x0fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1132" ] ; then
 ARCH=msp:110
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x122" ] ; then
 ARCH=msp:12
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0xfe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1222" ] ; then
 ARCH=msp:12
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0xfe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x123" ] ; then
 ARCH=msp:12
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1232" ] ; then
 ARCH=msp:12
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x133" ] ; then
 ARCH=msp:13
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1331" ] ; then
 ARCH=msp:13
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x135" ] ; then
 ARCH=msp:13
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1351" ] ; then
 ARCH=msp:13
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x147" ] ; then
 ARCH=msp:14
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1K
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x148" ] ; then
 ARCH=msp:14
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x4000
 ROM_SIZE=0xbfe0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430x149" ] ; then
 ARCH=msp:14
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x1100
 ROM_SIZE=0xeee0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430x155" ] ; then
 ARCH=msp:15
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x156" ] ; then
 ARCH=msp:15
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xa000
 ROM_SIZE=0x5fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x157" ] ; then
 ARCH=msp:15
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1K
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x167" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1K
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x168" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x4000
 ROM_SIZE=0xbfe0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430x169" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x1100
 ROM_SIZE=0xeee0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1610" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x1100
 RAM_SIZE=0x1400
-
 STACK=0x2500
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1611" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x4000
 ROM_SIZE=0xbfe0
 RAM_START=0x1100
 RAM_SIZE=0x2800
-
 STACK=0x3900
 fi
 
 if [ "${MSP430_NAME}" = "msp430x1612" ] ; then
 ARCH=msp:16
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x2500
 ROM_SIZE=0xdae0
 RAM_START=0x1100
 RAM_SIZE=0x1400
-
 STACK=0x2500
 fi
 
 if [ "${MSP430_NAME}" = "msp430x2101" ] ; then
 ARCH=msp:21
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xFC00
 ROM_SIZE=0x03e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x2111" ] ; then
 ARCH=msp:21
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xF800
 ROM_SIZE=0x07e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x2121" ] ; then
 ARCH=msp:21
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0x0fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x2131" ] ; then
 ARCH=msp:21
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x311" ] ; then
 ARCH=msp:31
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf800
 ROM_SIZE=0x07e0
 RAM_START=0x0200
 RAM_SIZE=128
-
 STACK=0x280
 fi
 
 if [ "${MSP430_NAME}" = "msp430x312" ] ; then
 ARCH=msp:31
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0x0fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x313" ] ; then
 ARCH=msp:31
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x314" ] ; then
 ARCH=msp:31
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xd000
 ROM_SIZE=0x2fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x315" ] ; then
 ARCH=msp:31
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x323" ] ; then
 ARCH=msp:32
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x325" ] ; then
 ARCH=msp:32
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x336" ] ; then
 ARCH=msp:33
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xa000
 ROM_SIZE=0x5fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x337" ] ; then
 ARCH=msp:33
-MACHINE=
 SCRIPT_NAME=elf32msp430_3
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x412" ] ; then
 ARCH=msp:41
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xf000
 ROM_SIZE=0x0fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x413" ] ; then
 ARCH=msp:41
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430x415" ] ; then
 ARCH=msp:41
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x417" ] ; then
 ARCH=msp:41
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x435" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430x436" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xa000
 ROM_SIZE=0x5fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x437" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x447" ] ; then
 ARCH=msp:44
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430x448" ] ; then
 ARCH=msp:44
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x4000
 ROM_SIZE=0xbfe0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430x449" ] ; then
 ARCH=msp:44
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x1100
 ROM_SIZE=0xeee0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430xE423" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430xE425" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430xE427" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430xG437" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=1024
-
 STACK=0x600
 fi
 
 if [ "${MSP430_NAME}" = "msp430xG438" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x4000
 ROM_SIZE=0xbef0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430xG439" ] ; then
 ARCH=msp:43
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x1100
 ROM_SIZE=0xeee0
 RAM_START=0x0200
 RAM_SIZE=0x0800
-
 STACK=0xa00
 fi
 
 if [ "${MSP430_NAME}" = "msp430xW423" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xe000
 ROM_SIZE=0x1fe0
 RAM_START=0x0200
 RAM_SIZE=256
-
 STACK=0x300
 fi
 
 if [ "${MSP430_NAME}" = "msp430xW425" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0xc000
 ROM_SIZE=0x3fe0
 RAM_START=0x0200
 RAM_SIZE=512
-
 STACK=0x400
 fi
 
 if [ "${MSP430_NAME}" = "msp430xW427" ] ; then
 ARCH=msp:42
-MACHINE=
-SCRIPT_NAME=elf32msp430
-OUTPUT_FORMAT="elf32-msp430"
-MAXPAGESIZE=1
-EMBEDDED=yes
-TEMPLATE_NAME=generic
-
 ROM_START=0x8000
 ROM_SIZE=0x7fe0
 RAM_START=0x0200
 RAM_SIZE=0x400
-
 STACK=0x600
 fi
Index: ld/emulparams/or32.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/or32.sh,v
retrieving revision 1.1
diff -u -p -w -r1.1 or32.sh
--- ld/emulparams/or32.sh	31 Jan 2002 17:33:07 -0000	1.1
+++ ld/emulparams/or32.sh	20 Jun 2006 00:53:54 -0000
@@ -1,6 +1,5 @@
 SCRIPT_NAME=or32
 OUTPUT_FORMAT="coff-or32-big"
-# OUTPUT_FORMAT="elf32-or32"
 TEXT_START_ADDR=0x1000000
 TARGET_PAGE_SIZE=0x1000000
 ARCH=or32
Index: ld/emulparams/or32elf.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/or32elf.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 or32elf.sh
--- ld/emulparams/or32elf.sh	30 May 2006 16:45:32 -0000	1.2
+++ ld/emulparams/or32elf.sh	20 Jun 2006 00:53:54 -0000
@@ -1,4 +1,6 @@
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-or32"
 TEXT_START_ADDR=0x1000000
 TARGET_PAGE_SIZE=0x1000000
Index: ld/emulparams/pjelf.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/pjelf.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 pjelf.sh
--- ld/emulparams/pjelf.sh	30 May 2006 16:45:32 -0000	1.2
+++ ld/emulparams/pjelf.sh	20 Jun 2006 00:53:54 -0000
@@ -1,4 +1,6 @@
 SCRIPT_NAME=elf
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
 OUTPUT_FORMAT="elf32-pj"
 TEXT_START_ADDR=0x1000000
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
Index: ld/emulparams/pjlelf.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/pjlelf.sh,v
retrieving revision 1.2
diff -u -p -w -r1.2 pjlelf.sh
--- ld/emulparams/pjlelf.sh	30 May 2006 16:45:32 -0000	1.2
+++ ld/emulparams/pjlelf.sh	20 Jun 2006 00:53:54 -0000
@@ -1,5 +1,2 @@
-SCRIPT_NAME=elf
+. ${srcdir}/emulparams/pjelf.sh
 OUTPUT_FORMAT="elf32-pjl"
-TEXT_START_ADDR=0x1000000
-MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
-ARCH=pj
Index: ld/emultempl/elf-generic.em
===================================================================
RCS file: ld/emultempl/elf-generic.em
diff -N ld/emultempl/elf-generic.em
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/emultempl/elf-generic.em	20 Jun 2006 00:53:54 -0000
@@ -0,0 +1,60 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is part of GLD, the Gnu Linker.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+# This file is sourced from elf32.em and from ELF targets that use
+# generic.em.
+#
+cat >>e${EMULATION_NAME}.c <<EOF
+
+static void
+gld${EMULATION_NAME}_map_segments (bfd_boolean need_layout)
+{
+  while (1)
+    {
+      if (output_bfd->xvec->flavour == bfd_target_elf_flavour)
+	{
+	  bfd_size_type phdr_size;
+
+	  phdr_size = elf_tdata (output_bfd)->program_header_size;
+	  if (!_bfd_elf_map_sections_to_segments (output_bfd, &link_info))
+	    einfo ("%F%P: map sections to segments failed: %E\n");
+
+	  if (phdr_size != elf_tdata (output_bfd)->program_header_size)
+	    need_layout = TRUE;
+	}
+
+      if (!need_layout)
+	break;
+
+      lang_reset_memory_regions ();
+
+      /* Resize the sections.  */
+      lang_size_sections (NULL, TRUE);
+
+      /* Redo special stuff.  */
+      ldemul_after_allocation ();
+
+      /* Do the assignments again.  */
+      lang_do_assignments ();
+
+      need_layout = FALSE;
+    }
+}
+EOF
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.167
diff -u -p -w -r1.167 elf32.em
--- ld/emultempl/elf32.em	14 Jun 2006 02:43:58 -0000	1.167
+++ ld/emultempl/elf32.em	20 Jun 2006 00:53:55 -0000
@@ -60,8 +60,7 @@ static void gld${EMULATION_NAME}_before_
 static void gld${EMULATION_NAME}_after_open (void);
 static void gld${EMULATION_NAME}_before_allocation (void);
 static bfd_boolean gld${EMULATION_NAME}_place_orphan (asection *s);
-static void gld${EMULATION_NAME}_layout_sections_again (void);
-static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
+static void gld${EMULATION_NAME}_finish (void);
 
 EOF
 
@@ -79,6 +78,7 @@ fi
 
 # Import any needed special functions and/or overrides.
 #
+. ${srcdir}/emultempl/elf-generic.em
 if test -n "$EXTRA_EM_FILE" ; then
 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
 fi
@@ -1560,26 +1560,11 @@ if test x"$LDEMUL_FINISH" != xgld"$EMULA
 cat >>e${EMULATION_NAME}.c <<EOF
 
 static void
-gld${EMULATION_NAME}_layout_sections_again (void)
-{
-  lang_reset_memory_regions ();
-
-  /* Resize the sections.  */
-  lang_size_sections (NULL, TRUE);
-
-  /* Redo special stuff.  */
-  ldemul_after_allocation ();
-
-  /* Do the assignments again.  */
-  lang_do_assignments ();
-}
-
-static void
 gld${EMULATION_NAME}_finish (void)
 {
-  if (bfd_elf_discard_info (output_bfd, &link_info))
-    gld${EMULATION_NAME}_layout_sections_again ();
+  bfd_boolean need_layout = bfd_elf_discard_info (output_bfd, &link_info);
 
+  gld${EMULATION_NAME}_map_segments (need_layout);
   finish_default ();
 }
 EOF
Index: ld/emultempl/genelf.em
===================================================================
RCS file: ld/emultempl/genelf.em
diff -N ld/emultempl/genelf.em
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/emultempl/genelf.em	20 Jun 2006 00:53:55 -0000
@@ -0,0 +1,39 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is part of GLD, the Gnu Linker.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+# This file is sourced from generic.em
+#
+cat >>e${EMULATION_NAME}.c <<EOF
+#include "elf-bfd.h"
+
+EOF
+. ${srcdir}/emultempl/elf-generic.em
+cat >>e${EMULATION_NAME}.c <<EOF
+
+static void
+gld${EMULATION_NAME}_finish (void)
+{
+  gld${EMULATION_NAME}_map_segments (FALSE);
+  finish_default ();
+}
+EOF
+# Put these extra routines in ld_${EMULATION_NAME}_emulation
+#
+LDEMUL_FINISH=gld${EMULATION_NAME}_finish
Index: ld/emultempl/hppaelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/hppaelf.em,v
retrieving revision 1.45
diff -u -p -w -r1.45 hppaelf.em
--- ld/emultempl/hppaelf.em	17 Nov 2005 00:10:05 -0000	1.45
+++ ld/emultempl/hppaelf.em	20 Jun 2006 00:53:55 -0000
@@ -220,9 +220,8 @@ hppaelf_layout_sections_again (void)
   /* If we have changed sizes of the stub sections, then we need
      to recalculate all the section offsets.  This may mean we need to
      add even more stubs.  */
-  need_laying_out = 0;
-
-  gld${EMULATION_NAME}_layout_sections_again ();
+  gld${EMULATION_NAME}_map_segments (TRUE);
+  need_laying_out = -1;
 }
 
 
@@ -248,7 +247,7 @@ build_section_lists (lang_statement_unio
    to build linker stubs.  */
 
 static void
-hppaelf_finish (void)
+gld${EMULATION_NAME}_finish (void)
 {
   /* bfd_elf_discard_info just plays with debugging sections,
      ie. doesn't affect any code, so we can delay resizing the
@@ -288,8 +287,8 @@ hppaelf_finish (void)
 	}
     }
 
-  if (need_laying_out)
-    hppaelf_layout_sections_again ();
+  if (need_laying_out != -1)
+    gld${EMULATION_NAME}_map_segments (need_laying_out);
 
   if (! link_info.relocatable)
     {
@@ -381,5 +380,5 @@ PARSE_AND_LIST_ARGS_CASES='
 # Put these extra hppaelf routines in ld_${EMULATION_NAME}_emulation
 #
 LDEMUL_AFTER_PARSE=hppaelf_after_parse
-LDEMUL_FINISH=hppaelf_finish
+LDEMUL_FINISH=gld${EMULATION_NAME}_finish
 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=hppaelf_create_output_section_statements
Index: ld/emultempl/mmo.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/mmo.em,v
retrieving revision 1.17
diff -u -p -w -r1.17 mmo.em
--- ld/emultempl/mmo.em	17 Nov 2005 00:10:05 -0000	1.17
+++ ld/emultempl/mmo.em	20 Jun 2006 00:53:55 -0000
@@ -18,16 +18,18 @@
 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 #
 
-# This file is sourced from elf32.em and mmo.em, used to define
-# linker MMIX-specifics common to ELF and MMO.
+# This file is sourced from generic.em
 
 cat >>e${EMULATION_NAME}.c <<EOF
 /* Need to have this define before mmix-elfnmmo, which includes
    needrelax.em which uses this name for the before_allocation function,
    normally defined in elf32.em.  */
 #define gldmmo_before_allocation before_allocation_default
+
+#include "elf-bfd.h"
 EOF
 
+. ${srcdir}/emultempl/elf-generic.em
 . ${srcdir}/emultempl/mmix-elfnmmo.em
 
 cat >>e${EMULATION_NAME}.c <<EOF
@@ -112,6 +114,7 @@ static void
 mmo_finish (void)
 {
   bfd_map_over_sections (output_bfd, mmo_wipe_sec_reloc_flag, NULL);
+  gld${EMULATION_NAME}_map_segments (FALSE);
   finish_default ();
 }
 
Index: ld/emultempl/ppc64elf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/ppc64elf.em,v
retrieving revision 1.49
diff -u -p -w -r1.49 ppc64elf.em
--- ld/emultempl/ppc64elf.em	17 Nov 2005 00:10:05 -0000	1.49
+++ ld/emultempl/ppc64elf.em	20 Jun 2006 00:53:56 -0000
@@ -258,9 +258,8 @@ ppc_layout_sections_again (void)
   /* If we have changed sizes of the stub sections, then we need
      to recalculate all the section offsets.  This may mean we need to
      add even more stubs.  */
-  need_laying_out = 0;
-
-  gld${EMULATION_NAME}_layout_sections_again ();
+  gld${EMULATION_NAME}_map_segments (TRUE);
+  need_laying_out = -1;
 }
 
 
@@ -311,7 +310,7 @@ build_section_lists (lang_statement_unio
 /* Final emulation specific call.  */
 
 static void
-ppc_finish (void)
+gld${EMULATION_NAME}_finish (void)
 {
   /* e_entry on PowerPC64 points to the function descriptor for
      _start.  If _start is missing, default to the first function
@@ -353,8 +352,8 @@ ppc_finish (void)
 	}
     }
 
-  if (need_laying_out)
-    ppc_layout_sections_again ();
+  if (need_laying_out != -1)
+    gld${EMULATION_NAME}_map_segments (need_laying_out);
 
   if (link_info.relocatable)
     {
@@ -574,6 +573,6 @@ PARSE_AND_LIST_ARGS_CASES='
 #
 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
-LDEMUL_FINISH=ppc_finish
+LDEMUL_FINISH=gld${EMULATION_NAME}_finish
 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
 LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern
Index: ld/testsuite/ld-elf/eh1.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elf/eh1.d,v
retrieving revision 1.1
diff -u -p -w -r1.1 eh1.d
--- ld/testsuite/ld-elf/eh1.d	24 May 2006 02:39:16 -0000	1.1
+++ ld/testsuite/ld-elf/eh1.d	20 Jun 2006 00:53:57 -0000
@@ -22,11 +22,11 @@ The section .eh_frame contains:
   DW_CFA_nop
   DW_CFA_nop
 
-00000018 0000001c 0000001c FDE cie=00000000 pc=004000b0..004000b0
-  DW_CFA_advance_loc: 0 to 004000b0
+00000018 0000001c 0000001c FDE cie=00000000 pc=00400078..00400078
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_offset: 16
   DW_CFA_offset: r6 at cfa-16
-  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_reg: r6
 
 00000038 ZERO terminator
Index: ld/testsuite/ld-elf/eh2.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elf/eh2.d,v
retrieving revision 1.1
diff -u -p -w -r1.1 eh2.d
--- ld/testsuite/ld-elf/eh2.d	24 May 2006 02:39:16 -0000	1.1
+++ ld/testsuite/ld-elf/eh2.d	20 Jun 2006 00:53:57 -0000
@@ -22,11 +22,11 @@ The section .eh_frame contains:
   DW_CFA_nop
   DW_CFA_nop
 
-00000018 0000001c 0000001c FDE cie=00000000 pc=004000b0..004000b0
-  DW_CFA_advance_loc: 0 to 004000b0
+00000018 0000001c 0000001c FDE cie=00000000 pc=00400078..00400078
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_offset: 16
   DW_CFA_offset: r6 at cfa-16
-  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_reg: r6
 
 00000038 ZERO terminator
Index: ld/testsuite/ld-elf/eh3.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elf/eh3.d,v
retrieving revision 1.1
diff -u -p -w -r1.1 eh3.d
--- ld/testsuite/ld-elf/eh3.d	24 May 2006 02:39:16 -0000	1.1
+++ ld/testsuite/ld-elf/eh3.d	20 Jun 2006 00:53:57 -0000
@@ -22,11 +22,11 @@ The section .eh_frame contains:
   DW_CFA_nop
   DW_CFA_nop
 
-00000018 0000001c 0000001c FDE cie=00000000 pc=004000b0..004000b0
-  DW_CFA_advance_loc: 0 to 004000b0
+00000018 0000001c 0000001c FDE cie=00000000 pc=00400078..00400078
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_offset: 16
   DW_CFA_offset: r6 at cfa-16
-  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_advance_loc: 0 to 00400078
   DW_CFA_def_cfa_reg: r6
 
 00000038 ZERO terminator

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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