PR25236, common sym versioning
authorAlan Modra <amodra@gmail.com>
Fri, 6 Dec 2019 00:51:45 +0000 (11:21 +1030)
committerAlan Modra <amodra@gmail.com>
Sat, 7 Dec 2019 05:51:01 +0000 (16:21 +1030)
In cases where a relocatable object file has a common symbol, no other
file has a definition, and there is a matching common symbol found in
a shared library then ld will output a definition using the largest of
size and alignment for the commons.  This patch fixes a bug in ld that
ignored common symbols when assigning versions, resulting in such
symbols being given VER_NDX_LOCAL versions.

PR 25236
* elflink.c (_bfd_elf_link_assign_sym_version): Assign versions
for ELF_COMMON_DEF_P symbols.
(elf_link_output_extsym, _bfd_elf_add_default_symbol): Adjust to
suit.

bfd/ChangeLog
bfd/elflink.c

index c1bba0cac160406d9bd5300d64995ccbb42afe68..50c878b29df6dffc84316bdbd471b1978e482a92 100644 (file)
@@ -1,3 +1,11 @@
+2019-12-07  Alan Modra  <amodra@gmail.com>
+
+       PR 25236
+       * elflink.c (_bfd_elf_link_assign_sym_version): Assign versions
+       for ELF_COMMON_DEF_P symbols.
+       (elf_link_output_extsym, _bfd_elf_add_default_symbol): Adjust to
+       suit.
+
 2019-12-05  Sandra Loosemore  <sandra@codesourcery.com>
 
        Only give FDE encoding warnings if --eh-frame-hdr was specified.
index 554936124c66c06d03fbedda22387d5a8da271c5..7078a2fb6f453c4789e4c121f39a990708314579 100644 (file)
@@ -1904,7 +1904,7 @@ _bfd_elf_add_default_symbol (bfd *abfd,
   if (skip)
     goto nondefault;
 
-  if (hi->def_regular)
+  if (hi->def_regular || ELF_COMMON_DEF_P (hi))
     {
       /* If the undecorated symbol will have a version added by a
         script different to H, then don't indirect to/from the
@@ -2367,7 +2367,7 @@ _bfd_elf_link_assign_sym_version (struct elf_link_hash_entry *h, void *data)
 
   /* We only need version numbers for symbols defined in regular
      objects.  */
-  if (!h->def_regular)
+  if (!h->def_regular && !ELF_COMMON_DEF_P (h))
     {
       /* Hide symbols defined in discarded input sections.  */
       if ((h->root.type == bfd_link_hash_defined
@@ -10246,7 +10246,7 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
          Elf_Internal_Versym iversym;
          Elf_External_Versym *eversym;
 
-         if (!h->def_regular)
+         if (!h->def_regular && !ELF_COMMON_DEF_P (h))
            {
              if (h->verinfo.verdef == NULL
                  || (elf_dyn_lib_class (h->verinfo.verdef->vd_bfd)