* elflink.c (_bfd_elf_merge_symbol): Treat weak as strong only
authorAlan Modra <amodra@gmail.com>
Thu, 15 Apr 2004 02:55:20 +0000 (02:55 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 15 Apr 2004 02:55:20 +0000 (02:55 +0000)
when it is a definition.

bfd/ChangeLog
bfd/elflink.c

index 7aff007df50c9f30f262bb2dd82b627875710627..e7148cbe79ab40c192562f8f0464d5b27a67fdc2 100644 (file)
@@ -1,3 +1,8 @@
+2004-04-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elflink.c (_bfd_elf_merge_symbol): Treat weak as strong only
+       when it is a definition.
+
 2004-04-14  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-sparc.c (elf32_sparc_relocate_section): Don't abort
index 4c27f8840e6db03e6eab6e1f27362b44023c2706..6628db34cce61c1676bab71f79c048f52eba5eb9 100644 (file)
@@ -887,16 +887,20 @@ _bfd_elf_merge_symbol (bfd *abfd,
   oldweak = (h->root.type == bfd_link_hash_defweak
             || h->root.type == bfd_link_hash_undefweak);
 
-  /* If a new weak symbol comes from a regular file and the old symbol
-     comes from a dynamic library, we treat the new one as strong.
-     Similarly, an old weak symbol from a regular file is treated as
-     strong when the new symbol comes from a dynamic library.  Further,
-     an old weak symbol from a dynamic library is treated as strong if
-     the new symbol is from a dynamic library.  This reflects the way
-     glibc's ld.so works.  */
-  if (!newdyn && olddyn)
+  /* If a new weak symbol definition comes from a regular file and the
+     old symbol comes from a dynamic library, we treat the new one as
+     strong.  Similarly, an old weak symbol definition from a regular
+     file is treated as strong when the new symbol comes from a dynamic
+     library.  Further, an old weak symbol from a dynamic library is
+     treated as strong if the new symbol is from a dynamic library.
+     This reflects the way glibc's ld.so works.
+
+     Do this before setting *type_change_ok or *size_change_ok so that
+     we warn properly when dynamic library symbols are overridden.  */
+
+  if (newdef && !newdyn && olddyn)
     newweak = FALSE;
-  if (newdyn)
+  if (olddef && newdyn)
     oldweak = FALSE;
 
   /* It's OK to change the type if either the existing symbol or the