Use dynamic text relocs for protected vars
authorAlan Modra <amodra@gmail.com>
Mon, 23 Feb 2015 06:15:05 +0000 (16:45 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 26 Feb 2015 03:39:50 +0000 (14:09 +1030)
Rather than reporting a link error on attempting to use dynbss for
protected vars, use dynamic text relocs.

* elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Heed -z nocopyreloc.
Use text relocs rather than giving an error on trying to use
.dynbss for protected shared lib vars.
* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.

bfd/ChangeLog
bfd/elf32-ppc.c
bfd/elf64-ppc.c

index 5eabbd732a75fd13934db9dbe73e4ce57b1a6be2..bddd7647df01aac2e0b4502c0afe22c893699aa3 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-26  Alan Modra  <amodra@gmail.com>
+
+       * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Heed -z nocopyreloc.
+       Use text relocs rather than giving an error on trying to use
+       .dynbss for protected shared lib vars.
+       * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.
+
 2015-02-25  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * elf32-avr.c (struct elf_avr_section_data): New structure.
index 33f59c82b20ec67fd2fb7ba4319b3fecdc51c06e..cee589f9a8f73413939ef23afd097d80f9f8fc94 100644 (file)
@@ -5582,6 +5582,13 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   if (!h->non_got_ref)
     return TRUE;
 
+  /* If -z nocopyreloc was given, we won't generate them either.  */
+  if (info->nocopyreloc)
+    {
+      h->non_got_ref = 0;
+      return TRUE;
+    }
+
    /* If we didn't find any dynamic relocs in read-only sections, then
       we'll be keeping the dynamic relocs and avoiding the copy reloc.
       We can't do this if there are any small data relocations.  This
@@ -5598,6 +5605,16 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
       return TRUE;
     }
 
+  /* Protected variables do not work with .dynbss.  The copy in
+     .dynbss won't be used by the shared library with the protected
+     definition for the variable.  Text relocations are preferable
+     to an incorrect program.  */
+  if (h->protected_def)
+    {
+      h->non_got_ref = 0;
+      return TRUE;
+    }
+
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.  There will be
      an entry for this symbol in the .dynsym section.  The dynamic
index a2ddb41a402e370877f73489ce68c0630a8d6d8d..1573e308781218394ad247e7924f434968605212 100644 (file)
@@ -7089,6 +7089,13 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   if (!h->def_dynamic || !h->ref_regular || h->def_regular)
     return TRUE;
 
+  /* If -z nocopyreloc was given, don't generate them either.  */
+  if (info->nocopyreloc)
+    {
+      h->non_got_ref = 0;
+      return TRUE;
+    }
+
   /* If we didn't find any dynamic relocs in read-only sections, then
      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
@@ -7097,6 +7104,16 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
       return TRUE;
     }
 
+  /* Protected variables do not work with .dynbss.  The copy in
+     .dynbss won't be used by the shared library with the protected
+     definition for the variable.  Text relocations are preferable
+     to an incorrect program.  */
+  if (h->protected_def)
+    {
+      h->non_got_ref = 0;
+      return TRUE;
+    }
+
   if (h->plt.plist != NULL)
     {
       /* We should never get here, but unfortunately there are versions