* elf64-ppc.c (func_desc_adjust): Give undefined dot-symbols a value
authorAlan Modra <amodra@gmail.com>
Wed, 18 Aug 2004 10:11:02 +0000 (10:11 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 18 Aug 2004 10:11:02 +0000 (10:11 +0000)
if we can look up their function descriptor in a regular file.

bfd/ChangeLog
bfd/elf64-ppc.c

index f9f11261d5c8ea6f8d0a5fc9c93a050cfcdd1a9a..ed6e667bde086abedb9ac9252494f1639c2bf230 100644 (file)
@@ -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
index ed679c28268779bfe55987dd40971e810a8d4ed5..33ffd3906c2151b3a460c6cf3831d5f45b575743 100644 (file)
@@ -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)