From a127494f2dcad834743e613be4cfea39511ad5ec Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 23 Feb 2015 16:45:05 +1030 Subject: [PATCH] Use dynamic text relocs for protected vars 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 | 7 +++++++ bfd/elf32-ppc.c | 17 +++++++++++++++++ bfd/elf64-ppc.c | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5eabbd732a7..bddd7647df0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2015-02-26 Alan Modra + + * 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 * elf32-avr.c (struct elf_avr_section_data): New structure. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 33f59c82b20..cee589f9a8f 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 a2ddb41a402..1573e308781 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 -- 2.30.2