aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-02-11 14:18:15 +0000
committerAlan Modra <amodra@gmail.com>2005-02-11 14:18:15 +0000
commit2917689a80eb96160c7d4d1788f050bdfdcae4f5 (patch)
tree01e0cd3875e7e3d2d8d4aafd8b3ef5dcbab8caa1 /bfd/elf64-ppc.c
parent16a48f83f6c37a7004c6586951df9522ada96400 (diff)
downloadgdb-2917689a80eb96160c7d4d1788f050bdfdcae4f5.zip
gdb-2917689a80eb96160c7d4d1788f050bdfdcae4f5.tar.gz
gdb-2917689a80eb96160c7d4d1788f050bdfdcae4f5.tar.bz2
* elf64-ppc.c (toc_adjusting_stub_needed): Return true for
old-style branches to undefined dot-symbols which will be satisfied by a plt call.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 4162d55..86419b9 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -8361,13 +8361,27 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
break;
}
- /* Ignore branches to undefined syms. */
+ /* 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)
- continue;
+ {
+ 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;
+ }
- /* Calls to dynamic lib functions go through a plt call stub
- that uses r2. Assume branches to other sections not included
- in the link need stubs too, to cover -R and absolute syms. */
+ /* 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)
{
ret = 1;
@@ -8389,7 +8403,6 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
opd_adjust = get_opd_info (sym_sec);
if (opd_adjust != NULL)
{
-
if (h == NULL)
{
long adjust;