diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.h | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1ee22b0..36a2522 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +Wed Jun 18 11:35:42 1997 Ian Lance Taylor <ian@cygnus.com> + + * elflink.h (elf_link_add_object_symbols): Don't let a common + symbol in a regular object override a common symbol in a shared + object if the latter was found via an indirect symbol. + Tue Jun 17 11:55:02 1997 Ian Lance Taylor <ian@cygnus.com> * cofflink.c (_bfd_coff_link_input_bfd): If stripping debugging diff --git a/bfd/elflink.h b/bfd/elflink.h index df74afe..09a7d8b 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -741,6 +741,7 @@ elf_link_add_object_symbols (abfd, info) { Elf_Internal_Versym iver; int vernum; + boolean indirect; boolean override; if (ever != NULL) @@ -850,9 +851,14 @@ elf_link_add_object_symbols (abfd, info) if (h->root.type == bfd_link_hash_new) h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; + indirect = false; while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; + { + if (h->root.type == bfd_link_hash_indirect) + indirect = true; + h = (struct elf_link_hash_entry *) h->root.u.i.link; + } /* FIXME: There are too many cases here, and it's too confusing. This code needs to be reorganized somehow. */ @@ -1008,7 +1014,8 @@ elf_link_add_object_symbols (abfd, info) && (h->root.u.def.section->flags & SEC_ALLOC) != 0 && (h->root.u.def.section->flags & SEC_LOAD) == 0 && h->size > 0 - && h->type != STT_FUNC) + && h->type != STT_FUNC + && ! indirect) { /* It would be best if we could set the hash table entry to a common symbol, but we don't know what to use for |