* elf64-ppc.c (struct ppc64_elf_obj_tdata): Add "deleted_section".
authorAlan Modra <amodra@gmail.com>
Tue, 17 Aug 2004 01:25:21 +0000 (01:25 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 17 Aug 2004 01:25:21 +0000 (01:25 +0000)
(adjust_opd_syms): Attach opd syms for deleted entries to one of
the sections that will be discarded.

bfd/ChangeLog
bfd/elf64-ppc.c

index 4bfcd1e7c55e1291c986961cb3435aa22ad09649..8cb7a6661fa7bc36ca70691591102111530bfee2 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-17  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (struct ppc64_elf_obj_tdata): Add "deleted_section".
+       (adjust_opd_syms): Attach opd syms for deleted entries to one of
+       the sections that will be discarded.
+
 2004-08-16  Alan Modra  <amodra@bigpond.net.au>
 
        * elflink.c (elf_section_complain_discarded): Ignore .fixup.
index fca84ac87c50b7684a1eb9055d77ea1593f53faf..ccb80896462baf379c2d34611354621f7237375b 100644 (file)
@@ -2333,6 +2333,10 @@ struct ppc64_elf_obj_tdata
   asection *got;
   asection *relgot;
 
+  /* Used during garbage collection.  We attach global symbols defined
+     on removed .opd entries to this section so that the sym is removed.  */
+  asection *deleted_section;
+
   /* TLS local dynamic got entry handling.  Suppose for multiple GOT
      sections means we potentially need one of these for each input bfd.  */
   union {
@@ -5227,8 +5231,18 @@ adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
       if (adjust == -1)
        {
          /* This entry has been deleted.  */
+         asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
+         if (dsec == NULL)
+           {
+             for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
+               if (elf_discarded_section (dsec))
+                 {
+                   ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
+                   break;
+                 }
+           }
          eh->elf.root.u.def.value = 0;
-         eh->elf.root.u.def.section = &bfd_abs_section;
+         eh->elf.root.u.def.section = dsec;
        }
       else
        eh->elf.root.u.def.value += adjust;