BFD/XCOFF: Fix storage class setting for weak defined symbols
authorMaciej W. Rozycki <macro@mips.com>
Wed, 18 Jul 2018 16:51:54 +0000 (17:51 +0100)
committerMaciej W. Rozycki <macro@mips.com>
Wed, 18 Jul 2018 16:51:54 +0000 (17:51 +0100)
Fix an issue with commit 8602d4fea60d ("Add AIX weak support"),
<https://sourceware.org/ml/binutils/2009-03/msg00189.html>, and use the
correct condition to set the storage class for weak defined symbols.

The context here is as follows:

  else if ((h->root.type == bfd_link_hash_defined
            || h->root.type == bfd_link_hash_defweak)
           && h->smclas == XMC_XO)
    {
      BFD_ASSERT (bfd_is_abs_section (h->root.u.def.section));
      isym.n_value = h->root.u.def.value;
      isym.n_scnum = N_UNDEF;
      if (h->root.type == bfd_link_hash_undefweak
          && C_WEAKEXT == C_AIX_WEAKEXT)
        isym.n_sclass = C_WEAKEXT;
      else
        isym.n_sclass = C_EXT;
      aux.x_csect.x_smtyp = XTY_ER;
    }

so clearly the inner condition can never be true.  Correct the condition
then to check for the `bfd_link_hash_defweak' symbol type instead here,
and in a similar place a little further down in the same function.

bfd/
* xcofflink.c (xcoff_write_global_symbol): Fix symbol type
checks for defined weak symbols.

bfd/ChangeLog
bfd/xcofflink.c

index 8dce930..c5960e6 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-18  Maciej W. Rozycki  <macro@mips.com>
+
+       * xcofflink.c (xcoff_write_global_symbol): Fix symbol type
+       checks for defined weak symbols.
+
 2018-07-17  Maciej W. Rozycki  <macro@mips.com>
 
        * elf32-nds32.c (nds32_elf_relax_loadstore): Use
index b7a50de..9705d30 100644 (file)
@@ -5589,7 +5589,7 @@ xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
       BFD_ASSERT (bfd_is_abs_symbol (&h->root));
       isym.n_value = h->root.u.def.value;
       isym.n_scnum = N_UNDEF;
-      if (h->root.type == bfd_link_hash_undefweak
+      if (h->root.type == bfd_link_hash_defweak
          && C_WEAKEXT == C_AIX_WEAKEXT)
        isym.n_sclass = C_WEAKEXT;
       else
@@ -5655,7 +5655,7 @@ xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
       /* We just output an SD symbol.  Now output an LD symbol.  */
       h->indx += 2;
 
-      if (h->root.type == bfd_link_hash_undefweak
+      if (h->root.type == bfd_link_hash_defweak
          && C_WEAKEXT == C_AIX_WEAKEXT)
        isym.n_sclass = C_WEAKEXT;
       else