* elflink.h (elf_link_add_object_symbols): Don't let a common
authorIan Lance Taylor <ian@airs.com>
Wed, 18 Jun 1997 15:36:33 +0000 (15:36 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 18 Jun 1997 15:36:33 +0000 (15:36 +0000)
symbol in a regular object override a common symbol in a shared
object if the latter was found via an indirect symbol.

bfd/ChangeLog
bfd/elflink.h

index 1ee22b093d71734e7c965010f992889ed2388b1b..36a2522093436c8008be0e2f3e726f6215476874 100644 (file)
@@ -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
index df74afe2ad452b4aafd47db24ca141fc58e947a7..09a7d8b2252d7998f1ac63001bee441c84cc220d 100644 (file)
@@ -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