ELF: Check ELF_COMMON_DEF_P for common symbols
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 7 Apr 2017 14:40:14 +0000 (07:40 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 7 Apr 2017 14:40:14 +0000 (07:40 -0700)
Since common symbols that are turned into definitions don't have the
DEF_REGULAR flag set, we need to check ELF_COMMON_DEF_P for common
symbols.

bfd/

PR ld/19579
PR ld/21306
* elf32-s390.c (elf_s390_finish_dynamic_symbol): Check
ELF_COMMON_DEF_P for common symbols.
* elf64-s390.c (elf_s390_finish_dynamic_symbol): Likewise.
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
* elflink.c (_bfd_elf_merge_symbol): Revert commits
202ac193bbbecc96a4978d1ac3d17148253f9b01 and
07492f668d2173da7a2bda3707ff0985e0f460b6.

ld/

PR ld/19579
PR ld/21306
* testsuite/ld-elf/pr19579a.c (main): Updated.

bfd/ChangeLog
bfd/elf32-s390.c
bfd/elf64-s390.c
bfd/elf64-x86-64.c
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/pr19579a.c

index da9eac6..a4664f8 100644 (file)
@@ -1,3 +1,15 @@
+2017-04-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/19579
+       PR ld/21306
+       * elf32-s390.c (elf_s390_finish_dynamic_symbol): Check
+       ELF_COMMON_DEF_P for common symbols.
+       * elf64-s390.c (elf_s390_finish_dynamic_symbol): Likewise.
+       * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
+       * elflink.c (_bfd_elf_merge_symbol): Revert commits
+       202ac193bbbecc96a4978d1ac3d17148253f9b01 and
+       07492f668d2173da7a2bda3707ff0985e0f460b6.
+
 2017-04-07  Pedro Alves  <palves@redhat.com>
 
        * opncls.c (bfd_get_debug_link_info): Rename to...
index fd1bc13..ddb6f5b 100644 (file)
@@ -3785,7 +3785,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
             RELATIVE reloc.  The entry in the global offset table
             will already have been initialized in the
             relocate_section function.  */
-         if (!h->def_regular)
+         if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
            return FALSE;
          BFD_ASSERT((h->got.offset & 1) != 0);
          rela.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
index b5fd05f..fbbf8d6 100644 (file)
@@ -3582,7 +3582,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
             RELATIVE reloc.  The entry in the global offset table
             will already have been initialized in the
             relocate_section function.  */
-         if (!h->def_regular)
+         if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
            return FALSE;
          BFD_ASSERT((h->got.offset & 1) != 0);
          rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
index 6d92c79..a4048f1 100644 (file)
@@ -4926,7 +4926,8 @@ do_ifunc_pointer:
                {
                  /* Symbol is referenced locally.  Make sure it is
                     defined locally or for a branch.  */
-                 fail = !h->def_regular && !branch;
+                 fail = (!(h->def_regular || ELF_COMMON_DEF_P (h))
+                         && !branch);
                }
              else if (!(bfd_link_pie (info)
                         && (h->needs_copy || eh->needs_copy)))
index 9bf75c8..c00d712 100644 (file)
@@ -1544,16 +1544,13 @@ _bfd_elf_merge_symbol (bfd *abfd,
      represent variables; this can cause confusion in principle, but
      any such confusion would seem to indicate an erroneous program or
      shared library.  We also permit a common symbol in a regular
-     object to override a weak symbol in a shared object.  A common
-     symbol in executable also overrides a symbol in a shared object.  */
+     object to override a weak symbol in a shared object.  */
 
   if (newdyn
       && newdef
       && (olddef
          || (h->root.type == bfd_link_hash_common
-             && (newweak
-                 || newfunc
-                 || (!olddyn && bfd_link_executable (info))))))
+             && (newweak || newfunc))))
     {
       *override = TRUE;
       newdef = FALSE;
index c632fd8..044b947 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/19579
+       PR ld/21306
+       * testsuite/ld-elf/pr19579a.c (main): Updated.
+
 2017-04-07  Nick Clifton  <nickc@redhat.com>
 
        PR 21090
index e4a6eb1..69d0f35 100644 (file)
@@ -9,7 +9,7 @@ extern int *bar_p (void);
 int
 main ()
 {
-  if (foo[0] == 0 && foo == foo_p () && bar[0] == 0 && bar == bar_p ())
+  if (foo[0] == 0 && foo == foo_p () && bar[0] == -1 && bar == bar_p ())
     printf ("PASS\n");
   return 0;
 }