OSDN Git Service

include/
authorAlan Modra <amodra@bigpond.net.au>
Thu, 3 Feb 2005 03:30:49 +0000 (03:30 +0000)
committerAlan Modra <amodra@bigpond.net.au>
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 c942cff..21e8a92 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 0e8bff4..ba2676d 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 34f66d1..5868b95 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 43d8ddf..2818977 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 789a38a..85b5c19 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