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 | |
parent | 474867c1241877200fa3d68161adea76c4f2cee9 (diff) | |
download | binutils-11f25ea6caba4354a6c58653e92e125313d5a659.zip binutils-11f25ea6caba4354a6c58653e92e125313d5a659.tar.gz binutils-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/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 20 | ||||
-rw-r--r-- | bfd/linker.c | 1 | ||||
-rw-r--r-- | include/ChangeLog | 4 | ||||
-rw-r--r-- | include/bfdlink.h | 1 |
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 |