PR ld/3107

Daniel Jacobowitz drow@false.org
Tue Nov 7 14:55:00 GMT 2006


On Mon, Nov 06, 2006 at 08:40:03AM +1030, Alan Modra wrote:
> Another possibility occurred to me:  You could run
> arm_process_before_allocation both from arm_size_dynamic_sections and
> arm_elf_before_allocation, the latter case only when the former won't
> run (ie. !dynamic_sections_created).  That way you could go back to
> using plt.offset, and wouldn't need to worry that the logic matched.
> I'm a little worried that the current test isn't quite right for
> symbols with non-default visibility.

I convinced myself that it was right, but yes, that would be nicer. 
Like the attached?  (Tested with binutils + glibc tests).

-- 
Daniel Jacobowitz
CodeSourcery

2006-11-07  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-07  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-07  Daniel Jacobowitz  <dan@codesourcery.com

	2006-11-01  Alan Modra  <amodra@bigpond.net.au>

Index: bfd/bfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in.h,v
retrieving revision 1.119
diff -u -p -r1.119 bfd-in.h
--- bfd/bfd-in.h	26 Oct 2006 00:01:31 -0000	1.119
+++ bfd/bfd-in.h	7 Nov 2006 14:21:40 -0000
@@ -868,7 +868,7 @@ extern bfd_boolean bfd_elf32_arm_allocat
   (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_glu
 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 *);
Index: bfd/bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.406
diff -u -p -r1.406 bfd-in2.h
--- bfd/bfd-in2.h	30 Oct 2006 23:25:49 -0000	1.406
+++ bfd/bfd-in2.h	7 Nov 2006 14:21:41 -0000
@@ -875,7 +875,7 @@ extern bfd_boolean bfd_elf32_arm_allocat
   (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_glu
 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 *);
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.99
diff -u -p -r1.99 elf32-arm.c
--- bfd/elf32-arm.c	3 Nov 2006 00:58:09 -0000	1.99
+++ bfd/elf32-arm.c	7 Nov 2006 14:21:42 -0000
@@ -2828,8 +2828,7 @@ static void check_use_blx(struct elf32_a
 
 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;
@@ -2852,13 +2851,12 @@ bfd_elf32_arm_process_before_allocation 
   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;
@@ -2934,19 +2932,9 @@ bfd_elf32_arm_process_before_allocation 
 	  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)
@@ -7909,6 +7897,16 @@ elf32_arm_readonly_dynrelocs (struct elf
   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
@@ -8024,6 +8022,13 @@ elf32_arm_size_dynamic_sections (bfd * o
      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.  */
Index: ld/emultempl/armelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/armelf.em,v
retrieving revision 1.51
diff -u -p -r1.51 armelf.em
--- ld/emultempl/armelf.em	23 Oct 2006 03:07:49 -0000	1.51
+++ ld/emultempl/armelf.em	7 Nov 2006 14:21:43 -0000
@@ -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 ();



More information about the Binutils mailing list