* elf32-arm.c (bfd_elf32_arm_process_before_allocation): Correct
authorDaniel Jacobowitz <drow@false.org>
Wed, 1 Nov 2006 20:00:25 +0000 (20:00 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 1 Nov 2006 20:00:25 +0000 (20:00 +0000)
check for PLT usage.

bfd/ChangeLog
bfd/elf32-arm.c

index b3ad7d6fb7f979fa690fd3e46f2d7875f0af7a52..2b3394a91baffccdbb6959d457f0913fccf012e7 100644 (file)
@@ -1,3 +1,8 @@
+2006-11-01  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf32-arm.c (bfd_elf32_arm_process_before_allocation): Correct
+       check for PLT usage.
+
 2006-11-01  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * elfxx-mips.c (mips_elf_merge_gots): Always use maxcnt.
index 06adaeff7d1bab805dcce1ce30b7049c1330cd51..2faac89db550ef7c0397dc62d5c3b9a2095ce81f 100644 (file)
@@ -2934,9 +2934,19 @@ 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.  */
-         if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
+         /* 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))
            continue;
 
          switch (r_type)