include/
authorAlan Modra <amodra@gmail.com>
Thu, 3 Feb 2005 03:30:49 +0000 (03:30 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 3 Feb 2005 03:30:49 +0000 (03:30 +0000)
* bfdlink.h (struct bfd_link_hash_entry): Add u.undef.weak.
bfd/
* linker.c (_bfd_generic_link_add_one_symbol): Set u.undef.weak.
* elflink.c (elf_smash_syms): Restore symbols that were undefweak
before the as-needed lib was loaded.  Abort on unexpected refs.

bfd/ChangeLog
bfd/elflink.c
bfd/linker.c
include/ChangeLog
include/bfdlink.h

index c942cffca5dbdeccf1dc1b0c8080d0542a10f187..21e8a9288b22ebf13e6e6bfe37630422dfe726e4 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-03  Alan Modra  <amodra@bigpond.net.au>
+
+       * linker.c (_bfd_generic_link_add_one_symbol): Set u.undef.weak.
+       * elflink.c (elf_smash_syms): Restore symbols that were undefweak
+       before the as-needed lib was loaded.  Abort on unexpected refs.
+
 2005-02-02  Alan Modra  <amodra@bigpond.net.au>
 
        * elflink.c (elf_smash_syms): Expand comments.
index 0e8bff4c557dbc546cd24dcbc0854bc3c0831a79..ba2676dfdf10e116c28532cba59d611d2b431d94 100644 (file)
@@ -2842,6 +2842,21 @@ elf_smash_syms (struct elf_link_hash_entry *h, void *data)
       return TRUE;
 
     case bfd_link_hash_undefined:
+      if (h->root.u.undef.abfd != inf->not_needed)
+       return TRUE;
+      if (h->root.u.undef.weak != NULL)
+       {
+         /* Symbol was undefweak in u.undef.weak bfd, and has become
+            undefined in as-needed lib.  Restore weak.  */
+         h->root.type = bfd_link_hash_undefweak;
+         h->root.u.undef.abfd = h->root.u.undef.weak;
+         if (h->root.u.undef.next != NULL
+             || inf->htab->root.undefs_tail == &h->root)
+           inf->twiddled = TRUE;
+         return TRUE;
+       }
+      break;
+
     case bfd_link_hash_undefweak:
       if (h->root.u.undef.abfd != inf->not_needed)
        return TRUE;
@@ -2868,6 +2883,11 @@ elf_smash_syms (struct elf_link_hash_entry *h, void *data)
       break;
     }
 
+  /* There is no way we can undo symbol table state from defined or
+     defweak back to undefined.  */
+  if (h->ref_regular)
+    abort ();
+
   /* Set sym back to newly created state, but keep undefs list pointer.  */
   bh = h->root.u.undef.next;
   if (bh != NULL || inf->htab->root.undefs_tail == &h->root)
index 34f66d1e94a8835c01e7c738b98882b6a385c2da..5868b955d1379d47a4422ac7733ae05f416fa67e 100644 (file)
@@ -1604,6 +1604,7 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
          /* Make a new weak undefined symbol.  */
          h->type = bfd_link_hash_undefweak;
          h->u.undef.abfd = abfd;
+         h->u.undef.weak = abfd;
          break;
 
        case CDEF:
index 43d8ddf8142fd389c6e1dbf4d56275039eee1747..281897717099d8fb2835d97427da88c47ab48106 100644 (file)
@@ -1,3 +1,7 @@
+2005-02-03  Alan Modra  <amodra@bigpond.net.au>
+
+       * bfdlink.h (struct bfd_link_hash_entry): Add u.undef.weak.
+
 2005-02-01  Alan Modra  <amodra@bigpond.net.au>
 
        * bfdlink.h (bfd_link_repair_undef_list): Declare.
index 789a38a07db3e8c070c9314803ca7a366b82b130..85b5c195b87c3199494f1c35562704bec957b644 100644 (file)
@@ -113,6 +113,7 @@ struct bfd_link_hash_entry
             undefined symbol list.  */
          struct bfd_link_hash_entry *next;
          bfd *abfd;            /* BFD symbol was found in.  */
+         bfd *weak;            /* BFD weak symbol was found in.  */
        } undef;
       /* bfd_link_hash_defined, bfd_link_hash_defweak.  */
       struct