This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Use dynamic text relocs for protected vars
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Thu, 26 Feb 2015 15:53:56 +1030
- Subject: Use dynamic text relocs for protected vars
- Authentication-results: sourceware.org; auth=none
Rather than reporting a link error on attempting to use dynbss for
protected vars, use dynamic text relocs. I think this is the best
solution so that's what I'm doing for powerpc.
* 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.
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 33f59c8..cee589f 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -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
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index a2ddb41..1573e30 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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
--
Alan Modra
Australia Development Lab, IBM