diff options
author | Alan Modra <amodra@gmail.com> | 2005-02-03 03:30:49 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-02-03 03:30:49 +0000 |
commit | 11f25ea6caba4354a6c58653e92e125313d5a659 (patch) | |
tree | 2a7d1be8902c9e3d51858f619791248536c23c86 /bfd/elflink.c | |
parent | 474867c1241877200fa3d68161adea76c4f2cee9 (diff) | |
download | gdb-11f25ea6caba4354a6c58653e92e125313d5a659.zip gdb-11f25ea6caba4354a6c58653e92e125313d5a659.tar.gz 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.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 20 |
1 files changed, 20 insertions, 0 deletions
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) |