diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 16 |
2 files changed, 18 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b3ad7d6..2b3394a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 06adaef..2faac89 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -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) |