diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b3ad7d6fb7..2b3394a91b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2006-11-01 Alan Modra + + * elf32-arm.c (bfd_elf32_arm_process_before_allocation): Correct + check for PLT usage. + 2006-11-01 Daniel Jacobowitz * elfxx-mips.c (mips_elf_merge_gots): Always use maxcnt. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 06adaeff7d..2faac89db5 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)