bfd/
authorDaniel Jacobowitz <drow@false.org>
Mon, 13 Nov 2006 20:39:21 +0000 (20:39 +0000)
committerDaniel Jacobowitz <drow@false.org>
Mon, 13 Nov 2006 20:39:21 +0000 (20:39 +0000)
* 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.
ld/
* emultempl/armelf.em (arm_elf_before_allocation): Only call
bfd_elf32_arm_process_before_allocation if no dynamic sections.

bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf32-arm.c
ld/ChangeLog
ld/emultempl/armelf.em

index 340c4f3c4e90a4397654f8fbd92872321476988c..3463f571801692bec9452e267ac5347ac7f62ee4 100644 (file)
@@ -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
index ed41851ba53e7b00dd39785d4146655b4fafb962..e671ee7d23e5eb68c796c112be4ca3709d6b52e5 100644 (file)
@@ -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 *);
index e4c92d7e3396e2955ed77ff46c68d6f4239ab13e..8f2af8bc45d56814463198296d58037b7801952b 100644 (file)
@@ -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 *);
index b2f4061c97b100e8887527a460f9f33dbf9358d6..dc784db7bda11823f5114c285912cbcd03535f31 100644 (file)
@@ -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.  */
index 7f838f627fbce64ce118163e5572ce7a9ce82a1d..4abbfbc72913ad509e2b8daf052740546f106385 100644 (file)
@@ -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
index f78b4957e9da818175d57e2b78a4b4048b582ef5..d52d387f9d16bde7fb1b32c5024c77635e123233 100644 (file)
@@ -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 ();