bfd/
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 5 May 2003 03:33:09 +0000 (03:33 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 5 May 2003 03:33:09 +0000 (03:33 +0000)
2003-05-04  H.J. Lu <hjl@gnu.org>

* elflink.h (elf_merge_symbol): Correctly handle weak definiton.

ld/testsuite/

2003-05-04  H.J. Lu <hjl@gnu.org>

* ld-elfvers/vers18.dsym: Updated for weak definiton change.
* ld-elfvers/vers18.ver: Likewise.
* ld-elfvers/vers19.ver: Likewise.

* ld-elfweak/elfweak.exp: Remove xfail.

bfd/ChangeLog
bfd/elflink.h
ld/testsuite/ChangeLog
ld/testsuite/ld-elfvers/vers18.dsym
ld/testsuite/ld-elfvers/vers18.ver
ld/testsuite/ld-elfvers/vers19.ver
ld/testsuite/ld-elfweak/dsowdata.dsym
ld/testsuite/ld-elfweak/elfweak.exp
ld/testsuite/ld-elfweak/weakdata.dsym

index 7950b0a..dfbc26d 100644 (file)
@@ -1,5 +1,9 @@
 2003-05-04  H.J. Lu <hjl@gnu.org>
 
+       * elflink.h (elf_merge_symbol): Correctly handle weak definiton.
+
+2003-05-04  H.J. Lu <hjl@gnu.org>
+
        * elflink.h (elf_merge_symbol): Don't record a hidden/internal
        symbol dynamic. Check indirection when removing the old
        definition for symbols with non-default visibility.
index 3aec4e0..dfcce7d 100644 (file)
@@ -484,6 +484,7 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
   int bind;
   bfd *oldbfd;
   bfd_boolean newdyn, olddyn, olddef, newdef, newdyncommon, olddyncommon;
+  bfd_boolean newweakdef, oldweakdef, newweakundef, oldweakundef;
 
   *skip = FALSE;
   *override = FALSE;
@@ -670,6 +671,49 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
       return TRUE;
     }
 
+  /* We need to treat weak definiton right, depending on if there is a
+     definition from a dynamic object.  */
+  if (bind == STB_WEAK)
+    {
+      if (olddef)
+       {
+          newweakdef = TRUE;
+          newweakundef = FALSE;
+       }
+      else
+       {
+          newweakdef = FALSE;
+          newweakundef = TRUE;
+       }
+    }
+  else
+    newweakdef = newweakundef = FALSE;
+
+  /* If the new weak definition comes from a relocatable file and the
+     old symbol comes from a dynamic object, we treat the new one as
+     strong.  */
+  if (newweakdef && !newdyn && olddyn)
+    newweakdef = FALSE;
+
+  if (h->root.type == bfd_link_hash_defweak)
+    {
+      oldweakdef = TRUE;
+      oldweakundef = FALSE;
+    }
+  else if (h->root.type == bfd_link_hash_undefweak)
+    {
+      oldweakdef = FALSE;
+      oldweakundef = TRUE;
+    }
+  else
+    oldweakdef = oldweakundef = FALSE;
+
+  /* If the old weak definition comes from a relocatable file and the
+     new symbol comes from a dynamic object, we treat the old one as
+     strong.  */
+  if (oldweakdef && !olddyn && newdyn)
+    oldweakdef = FALSE;
+
   /* NEWDYNCOMMON and OLDDYNCOMMON indicate whether the new or old
      symbol, respectively, appears to be a common symbol in a dynamic
      object.  If a symbol appears in an uninitialized section, and is
@@ -698,7 +742,8 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
       && (sec->flags & SEC_ALLOC) != 0
       && (sec->flags & SEC_LOAD) == 0
       && sym->st_size > 0
-      && bind != STB_WEAK
+      && !newweakdef
+      && !newweakundef
       && ELF_ST_TYPE (sym->st_info) != STT_FUNC)
     newdyncommon = TRUE;
   else
@@ -721,9 +766,10 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
      a shared object, in which case, the DT_NEEDED entry may not be
      required at the run time.  */
 
-  if ((! dt_needed && h->root.type == bfd_link_hash_defweak)
-      || h->root.type == bfd_link_hash_undefweak
-      || bind == STB_WEAK)
+  if ((! dt_needed && oldweakdef)
+      || oldweakundef
+      || newweakdef
+      || newweakundef)
     *type_change_ok = TRUE;
 
   /* It's OK to change the size if either the existing symbol or the
@@ -781,11 +827,13 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
       && newdef
       && (olddef
          || (h->root.type == bfd_link_hash_common
-             && (bind == STB_WEAK
+             && (newweakdef
+                 || newweakundef
                  || ELF_ST_TYPE (sym->st_info) == STT_FUNC)))
-      && (h->root.type != bfd_link_hash_defweak
+      && (!oldweakdef
          || dt_needed
-         || bind == STB_WEAK))
+         || newweakdef
+         || newweakundef))
     {
       *override = TRUE;
       newdef = FALSE;
@@ -838,13 +886,11 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
   if (! newdyn
       && (newdef
          || (bfd_is_com_section (sec)
-             && (h->root.type == bfd_link_hash_defweak
-                 || h->type == STT_FUNC)))
+             && (oldweakdef || h->type == STT_FUNC)))
       && olddyn
       && olddef
       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
-      && (bind != STB_WEAK
-         || h->root.type == bfd_link_hash_defweak))
+      && ((!newweakdef && !newweakundef) || oldweakdef))
     {
       /* Change the hash table entry to undefined, and let
         _bfd_generic_link_add_one_symbol do the right thing with the
@@ -940,10 +986,11 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
      the DT_NEEDED entry may not be required at the run time.  */
   if (olddef
       && ! dt_needed
-      && h->root.type == bfd_link_hash_defweak
+      && oldweakdef
       && newdef
       && newdyn
-      && bind != STB_WEAK)
+      && !newweakdef
+      && !newweakundef)
     {
       /* To make this work we have to frob the flags so that the rest
         of the code does not think we are using the regular
@@ -969,10 +1016,10 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
      as a definition.  */
   if (olddef
       && olddyn
-      && h->root.type != bfd_link_hash_defweak
+      && !oldweakdef
       && newdef
       && ! newdyn
-      && bind == STB_WEAK)
+      && (newweakdef || newweakundef))
     *override = TRUE;
 
   return TRUE;
index 9a2bb79..372b812 100644 (file)
@@ -1,3 +1,11 @@
+2003-05-04  H.J. Lu <hjl@gnu.org>
+
+       * ld-elfvers/vers18.dsym: Updated for weak definiton change.
+       * ld-elfvers/vers18.ver: Likewise.
+       * ld-elfvers/vers19.ver: Likewise.
+
+       * ld-elfweak/elfweak.exp: Remove xfail.
+
 2003-05-04  Alexandre Oliva  <aoliva@redhat.com>
 
        * ld-mips-elf/multi-got-1.d: Force into big-endian mode.
index dc3ad7b..c60237a 100644 (file)
@@ -1,7 +1,7 @@
-[0-9a-f]*  w   DF (\*UND\*)    [0-9a-f]*  VERS_2.0    (0x[0-9a-f][0-9a-f] )?show_foo
 [0]* g    DO \*ABS\*   [0]*  VERS_1.1    VERS_1.1
 [0]* g    DO \*ABS\*   [0]*  VERS_1.2    VERS_1.2
 [0]* g    DO \*ABS\*   [0]*  VERS_2.0    VERS_2.0
 [0-9a-f]*  w   DF (.text|\*ABS\*)      [0-9a-f]* \(Base\)       (0x[0-9a-f][0-9a-f] )?show_foo
 [0-9a-f]*  w   DF (.text|\*ABS\*)      [0-9a-f]* \(VERS_1.1\)   (0x[0-9a-f][0-9a-f] )?show_foo
 [0-9a-f]*  w   DF (.text|\*ABS\*)      [0-9a-f]* \(VERS_1.2\)   (0x[0-9a-f][0-9a-f] )?show_foo
+[0-9a-f]*  w   DF (.text|\*ABS\*)      [0-9a-f]*  VERS_2.0    (0x[0-9a-f][0-9a-f] )?show_foo
index 5df92c8..c6b14e8 100644 (file)
@@ -3,10 +3,5 @@ Version definitions:
 2 0x00 0x0a7927b1 VERS_1.1
 3 0x00 0x0a7927b2 VERS_1.2
        VERS_1.1 
-4 0x02 0x0a7922b0 VERS_2.0
+4 0x00 0x0a7922b0 VERS_2.0
        VERS_1.2 
-
-Version References:
-  required from tmpdir/vers17.so:
-    0x0a7922b0 0x00 05 VERS_2.0
-
index 5969797..28a52c4 100644 (file)
@@ -1,3 +1,3 @@
 Version References:
-  required from vers17.so:
+  required from tmpdir/vers18.so:
     0x0a7922b0 0x00 0[23] VERS_2.0
index 0b5cca3..e0f579a 100644 (file)
@@ -1 +1 @@
-[0-9a-f]*[     ]+w[    ]+DO[   ]+.data[        ]+[0-9a-f]*[    ]+(Base[        ]+|[    ]*)deallocate_foo
+[0-9a-f]*[     ]+w[    ]+DO[   ]+.(s|)data[    ]+[0-9a-f]*[    ]+(Base[        ]+|[    ]*)deallocate_foo
index 11dd323..d67538d 100644 (file)
@@ -443,36 +443,24 @@ if {![ld_link $ld $tmpdir/libbar1a.so "$shared $tmpdir/bar1a.o $tmpdir/libfoo1a.
 
 build_lib "ELF DSO weak func first" libfoo "foo.o bar.o" dso.dsym
 build_lib "ELF DSO weak func last" libfoo "bar.o foo.o" dso.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak func first DSO" libfoo "foo.o libbar.so" dsow.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak func last DSO" libfoo "libbar.so foo.o" dsow.dsym
 build_exec "ELF weak func first" foo "main.o bar.o" "" strong "" strong.sym
 build_exec "ELF weak func last" foo "bar.o main.o" "" strong "" strong.sym
-setup_xfail "*-*-*"
 build_exec "ELF weak func first DSO" foo "main.o libbar.so" "-rpath ." weak weak.dsym ""
-setup_xfail "*-*-*"
 build_exec "ELF weak func last DSO" foo "libbar.so main.o" "-rpath ." weak weak.dsym ""
 
 build_lib "ELF DSO weak data first" libfoo "bar1a.o foo1a.o" dsodata.dsym
 build_lib "ELF DSO weak data last" libfoo "foo1a.o bar1a.o" dsodata.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak data first DSO" libfoo "main1.o libfoo1a.so" dsowdata.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak data last DSO" libfoo "libfoo1a.so main1.o" dsowdata.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak data first DSO common" libfoo "main1.o libfoo1b.so" dsowdata.dsym
-setup_xfail "*-*-*"
 build_lib "ELF DSO weak data last DSO common" libfoo "libfoo1b.so main1.o" dsowdata.dsym
 build_exec "ELF weak data first" foo "main1.o bar1a.o foo1a.o" "" strongdata "" strongdata.sym
 build_exec "ELF weak data last" foo "foo1a.o main1.o bar1a.o" "" strongdata "" strongdata.sym
 build_exec "ELF weak data first common" foo "main1.o bar1a.o foo1b.o" "" strongdata "" strongcomm.sym
 build_exec "ELF weak data last common" foo "foo1b.o main1.o bar1a.o" "" strongdata "" strongcomm.sym
-setup_xfail "*-*-*"
 build_exec "ELF weak data first DSO" foo "main1.o libbar1a.so libfoo1a.so" "-rpath ." weakdata weakdata.dsym ""
-setup_xfail "*-*-*"
 build_exec "ELF weak data last DSO" foo "libfoo1a.so main1.o libbar1a.so" "-rpath ." weakdata weakdata.dsym ""
-setup_xfail "*-*-*"
 build_exec "ELF weak data first DSO common" foo "main1.o libbar1a.so libfoo1b.so" "-rpath ." weakdata weakdata.dsym ""
-setup_xfail "*-*-*"
 build_exec "ELF weak data last DSO common" foo "libfoo1b.so main1.o libbar1a.so" "-rpath ." weakdata weakdata.dsym ""
index 0b5cca3..e0f579a 100644 (file)
@@ -1 +1 @@
-[0-9a-f]*[     ]+w[    ]+DO[   ]+.data[        ]+[0-9a-f]*[    ]+(Base[        ]+|[    ]*)deallocate_foo
+[0-9a-f]*[     ]+w[    ]+DO[   ]+.(s|)data[    ]+[0-9a-f]*[    ]+(Base[        ]+|[    ]*)deallocate_foo