From 11f25ea6caba4354a6c58653e92e125313d5a659 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 3 Feb 2005 03:30:49 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/elflink.c | 20 ++++++++++++++++++++ bfd/linker.c | 1 + include/ChangeLog | 4 ++++ include/bfdlink.h | 1 + 5 files changed, 32 insertions(+) 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 + + * 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 * 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 + + * bfdlink.h (struct bfd_link_hash_entry): Add u.undef.weak. + 2005-02-01 Alan Modra * 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 -- 2.7.4