aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c18
2 files changed, 23 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f9f1126..ed6e667 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-18 Alan Modra <amodra@bigpond.net.au>
+
+ * elf64-ppc.c (func_desc_adjust): Give undefined dot-symbols a value
+ if we can look up their function descriptor in a regular file.
+
2004-08-18 Nick Clifton <nickc@redhat.com>
PR 324
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index ed679c2..33ffd39 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -5061,6 +5061,24 @@ func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
info = inf;
htab = ppc_hash_table (info);
+ /* Resolve undefined references to dot-symbols as the value
+ in the function descriptor, if we have one in a regular object.
+ This is to satisfy cases like ".quad .foo". Calls to functions
+ in dynamic objects are handled elsewhere. */
+ if (fh->elf.root.type == bfd_link_hash_undefweak
+ && fh->was_undefined
+ && (fh->oh->elf.root.type == bfd_link_hash_defined
+ || fh->oh->elf.root.type == bfd_link_hash_defweak)
+ && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
+ && opd_entry_value (fh->oh->elf.root.u.def.section,
+ fh->oh->elf.root.u.def.value,
+ &fh->elf.root.u.def.section,
+ &fh->elf.root.u.def.value) != (bfd_vma) -1)
+ {
+ fh->elf.root.type = fh->oh->elf.root.type;
+ fh->elf.elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
+ }
+
/* If this is a function code symbol, transfer dynamic linking
information to the function descriptor symbol. */
if (!fh->is_func)