diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 340c4f3c4e9..3463f571801 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+2006-11-13  Daniel Jacobowitz  <dan@codesourcery.com>
+
+	* bfd-in.h (bfd_elf32_arm_process_before_allocation): Update
+	prototype.
+	(bfd_elf32_arm_set_byteswap_code): New prototype.
+	* bfd-in2.h: Regenerate.
+	* elf32-arm.c (bfd_elf32_arm_process_before_allocation): Don't take
+	byteswap_code as an argument.  Revert 2006-11-01 change.
+	(bfd_elf32_arm_set_byteswap_code): New.
+	(elf32_arm_size_dynamic_sections): Call
+	bfd_elf32_arm_process_before_allocation.
+
 2006-11-10  Thiemo Seufer  <ths@mips.com>
 
 	* config.bfd (mips*el-sde-elf*, mips*-sde-elf*): Drop ECOFF support
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index ed41851ba53..e671ee7d23e 100644
--- a/bfd/bfd-in.h
+++ b/bfd/bfd-in.h
@@ -868,7 +868,7 @@ extern bfd_boolean bfd_elf32_arm_allocate_interworking_sections
   (struct bfd_link_info *);
 
 extern bfd_boolean bfd_elf32_arm_process_before_allocation
-  (bfd *, struct bfd_link_info *, int);
+  (bfd *, struct bfd_link_info *);
 
 void bfd_elf32_arm_set_target_relocs
   (struct bfd_link_info *, int, char *, int, int);
@@ -887,6 +887,8 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
 extern bfd_boolean bfd_is_arm_special_symbol_name
   (const char * name, int type);
 
+extern void bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *, int);
+
 /* ARM Note section processing.  */
 extern bfd_boolean bfd_arm_merge_machines
   (bfd *, bfd *);
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index e4c92d7e339..8f2af8bc45d 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -875,7 +875,7 @@ extern bfd_boolean bfd_elf32_arm_allocate_interworking_sections
   (struct bfd_link_info *);
 
 extern bfd_boolean bfd_elf32_arm_process_before_allocation
-  (bfd *, struct bfd_link_info *, int);
+  (bfd *, struct bfd_link_info *);
 
 void bfd_elf32_arm_set_target_relocs
   (struct bfd_link_info *, int, char *, int, int);
@@ -894,6 +894,8 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
 extern bfd_boolean bfd_is_arm_special_symbol_name
   (const char * name, int type);
 
+extern void bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *, int);
+
 /* ARM Note section processing.  */
 extern bfd_boolean bfd_arm_merge_machines
   (bfd *, bfd *);
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index b2f4061c97b..dc784db7bda 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -2826,8 +2826,7 @@ static void check_use_blx(struct elf32_arm_link_hash_table *globals)
 
 bfd_boolean
 bfd_elf32_arm_process_before_allocation (bfd *abfd,
-					 struct bfd_link_info *link_info,
-					 int byteswap_code)
+					 struct bfd_link_info *link_info)
 {
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Rela *internal_relocs = NULL;
@@ -2850,13 +2849,12 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
   BFD_ASSERT (globals != NULL);
   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
 
-  if (byteswap_code && !bfd_big_endian (abfd))
+  if (globals->byteswap_code && !bfd_big_endian (abfd))
     {
       _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
 			  abfd);
       return FALSE;
     }
-  globals->byteswap_code = byteswap_code;
 
   /* Rummage around all the relocs and map the glue vectors.  */
   sec = abfd->sections;
@@ -2932,19 +2930,9 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
 	  if (h == NULL)
 	    continue;
 
-	  /* If the call will go through a PLT entry then we do not
-	     need glue.  We have to do a fairly complicated check
-	     here, since we don't determine this finally (by setting
-	     plt.offset) until later; this test should be kept in sync
-	     with elf32_arm_adjust_dynamic_symbol.  */
-	  if (globals->splt != NULL
-	      && h->plt.refcount > 0
-	      && (h->type == STT_FUNC
-		  || h->type == STT_ARM_TFUNC
-		  || h->needs_plt)
-	      && !SYMBOL_CALLS_LOCAL (link_info, h)
-	      && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
-		   && h->root.type == bfd_link_hash_undefweak))
+	  /* If the call will go through a PLT entry then we do not need
+	     glue.  */
+	  if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
 	    continue;
 
 	  switch (r_type)
@@ -7917,6 +7905,16 @@ elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
   return TRUE;
 }
 
+void
+bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
+				 int byteswap_code)
+{
+  struct elf32_arm_link_hash_table *globals;
+
+  globals = elf32_arm_hash_table (info);
+  globals->byteswap_code = byteswap_code;
+}
+
 /* Set the sizes of the dynamic sections.  */
 
 static bfd_boolean
@@ -8032,6 +8030,13 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
      sym dynamic relocs.  */
   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
 
+  /* Here we rummage through the found bfds to collect glue information.  */
+  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
+    if (!bfd_elf32_arm_process_before_allocation (ibfd, info))
+      /* xgettext:c-format */
+      _bfd_error_handler (_("Errors encountered processing file %s"),
+			  ibfd->filename);
+
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 7f838f627fb..4abbfbc7291 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2006-11-13  Daniel Jacobowitz  <dan@codesourcery.com>
+
+	* emultempl/armelf.em (arm_elf_before_allocation): Only call
+	bfd_elf32_arm_process_before_allocation if no dynamic sections.
+
 2006-11-08  Alan Modra  <amodra@bigpond.net.au>
 
 	* emultempl/elf32.em (gld*_before_allocation): Adjust output section
diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
index f78b4957e9d..d52d387f9d1 100644
--- a/ld/emultempl/armelf.em
+++ b/ld/emultempl/armelf.em
@@ -121,21 +121,22 @@ arm_elf_before_allocation (void)
       if (bfd_for_interwork != NULL)
 	bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
     }
-  /* We should be able to set the size of the interworking stub section.  */
 
-  /* Here we rummage through the found bfds to collect glue information.  */
-  /* FIXME: should this be based on a command line option? krk@cygnus.com  */
-  {
-    LANG_FOR_EACH_INPUT_STATEMENT (is)
-      {
-	if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, & link_info,
-						      byteswap_code))
-	  {
+  bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code);
+
+  /* We should be able to set the size of the interworking stub section.  We
+     can't do it until later if we have dynamic sections, though.  */
+  if (! elf_hash_table (&link_info)->dynamic_sections_created)
+    {
+      /* Here we rummage through the found bfds to collect glue information.  */
+      LANG_FOR_EACH_INPUT_STATEMENT (is)
+	{
+	  if (!bfd_elf32_arm_process_before_allocation (is->the_bfd,
+							&link_info))
 	    /* xgettext:c-format */
 	    einfo (_("Errors encountered processing file %s"), is->filename);
-	  }
-      }
-  }
+	}
+    }
 
   /* Call the standard elf routine.  */
   gld${EMULATION_NAME}_before_allocation ();