aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-02-03 03:30:49 +0000
committerAlan Modra <amodra@gmail.com>2005-02-03 03:30:49 +0000
commit11f25ea6caba4354a6c58653e92e125313d5a659 (patch)
tree2a7d1be8902c9e3d51858f619791248536c23c86
parent474867c1241877200fa3d68161adea76c4f2cee9 (diff)
downloadfsf-binutils-gdb-11f25ea6caba4354a6c58653e92e125313d5a659.zip
fsf-binutils-gdb-11f25ea6caba4354a6c58653e92e125313d5a659.tar.gz
fsf-binutils-gdb-11f25ea6caba4354a6c58653e92e125313d5a659.tar.bz2
include/
* 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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c20
-rw-r--r--bfd/linker.c1
-rw-r--r--include/ChangeLog4
-rw-r--r--include/bfdlink.h1
5 files changed, 32 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c942cff..21e8a92 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 0e8bff4..ba2676d 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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)
diff --git a/bfd/linker.c b/bfd/linker.c
index 34f66d1..5868b95 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -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:
diff --git a/include/ChangeLog b/include/ChangeLog
index 43d8ddf..2818977 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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.
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 789a38a..85b5c19 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -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