* elflink.c (_bfd_elf_merge_symbol): Reinstate code to handle
authorAlan Modra <amodra@gmail.com>
Thu, 18 Mar 2004 23:02:06 +0000 (23:02 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 18 Mar 2004 23:02:06 +0000 (23:02 +0000)
strong syms in one shared object overriding weak syms in another.

bfd/ChangeLog
bfd/elflink.c

index eb91f6ea32226ddcf2c2b0d4a2d36d95167e7e4a..fb1e2c40059d056d89e3536d7fcfbcfb94519bec 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-19  Alan Modra  <amodra@bigpond.net.au>
+
+       * elflink.c (_bfd_elf_merge_symbol): Reinstate code to handle
+       strong syms in one shared object overriding weak syms in another.
+
 2004-03-18  Alan Modra  <amodra@bigpond.net.au>
 
        * elf-bfd.h (struct elf_obj_tdata): Delete dt_soname field.  Add
index c9db782dad1f065a03468a05aa1d6838014c08ec..0a5c17512065daca67f76bf32ba0c456d150f3cd 100644 (file)
@@ -1153,6 +1153,30 @@ _bfd_elf_merge_symbol (bfd *abfd,
        }
     }
 
+  /* Handle the special case of a weak definition in one shared object
+     followed by a non-weak definition in another.  We are covering for
+     a deficiency of _bfd_generic_link_add_one_symbol here.  A new
+     strong definition of an indirect symbol is treated as a multiple
+     definition even when the indirect symbol points to a weak sym.  */
+  if (olddef
+      && oldweak
+      && olddyn
+      && newdef
+      && !newweak
+      && newdyn)
+    {
+      /* To make this work we have to frob the flags so that the rest
+        of the code does not think we are using the old definition.  */
+      h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
+      h->elf_link_hash_flags &= ~ELF_LINK_HASH_DEF_DYNAMIC;
+
+      /* If H is the target of an indirection, we want the caller to
+        use H rather than the indirect symbol.  Otherwise if we are
+        defining a new indirect symbol we will wind up attaching it
+        to the entry we are overriding.  */
+      *sym_hash = h;
+    }
+
   return TRUE;
 }