diff options
author | Alan Modra <amodra@gmail.com> | 2008-08-11 14:38:40 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2008-08-11 14:38:40 +0000 |
commit | 90aecf7a80c1cefeb45fc10a6cd02c8338e34b4c (patch) | |
tree | e3c03b90066a0ec5f88f08d29552b8c75d039675 /bfd | |
parent | 818236e51ddfafe9688b99e1ce5ddc3d2dc4a0a9 (diff) | |
download | gdb-90aecf7a80c1cefeb45fc10a6cd02c8338e34b4c.zip gdb-90aecf7a80c1cefeb45fc10a6cd02c8338e34b4c.tar.gz gdb-90aecf7a80c1cefeb45fc10a6cd02c8338e34b4c.tar.bz2 |
* elf64-ppc.c (toc_adjusting_stub_needed): Any call via the plt
needs r2 valid, not just those to external syms.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 28 |
2 files changed, 18 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0fd031c..4d8b0c6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2008-08-11 Alan Modra <amodra@bigpond.net.au> + + * 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 <pedro@codesourcery.com> * archive.c (_bfd_archive_bsd_update_armap_timestamp): Cast stat diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 727b6ac..3ee3f69 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) |