diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0fd031c4d6..4d8b0c6668 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2008-08-11 Alan Modra + + * elf64-ppc.c (toc_adjusting_stub_needed): Any call via the plt + needs r2 valid, not just those to external syms. + 2008-08-09 Pedro Alves * archive.c (_bfd_archive_bsd_update_armap_timestamp): Cast stat diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 727b6ac2b1..3ee3f69e28 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9184,6 +9184,7 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec) enum elf_ppc64_reloc_type r_type; unsigned long r_symndx; struct elf_link_hash_entry *h; + struct ppc_link_hash_entry *eh; Elf_Internal_Sym *sym; asection *sym_sec; struct _opd_sec_data *opd; @@ -9206,24 +9207,21 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec) } /* Calls to dynamic lib functions go through a plt call stub - that uses r2. Branches to undefined symbols might be a call - using old-style dot symbols that can be satisfied by a plt - call into a new-style dynamic library. */ - if (sym_sec == NULL) + that uses r2. */ + eh = (struct ppc_link_hash_entry *) h; + if (eh != NULL + && (eh->elf.plt.plist != NULL + || (eh->oh != NULL + && eh->oh->elf.plt.plist != NULL))) { - struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h; - if (eh != NULL - && eh->oh != NULL - && eh->oh->elf.plt.plist != NULL) - { - ret = 1; - break; - } - - /* Ignore other undefined symbols. */ - continue; + ret = 1; + break; } + if (sym_sec == NULL) + /* Ignore other undefined symbols. */ + continue; + /* Assume branches to other sections not included in the link need stubs too, to cover -R and absolute syms. */ if (sym_sec->output_section == NULL)