This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add aarch64-specific --no-apply-dynamic-relocs option.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0eccf19f96d6218dd7c2f8d13f0546c2b942cc08

commit 0eccf19f96d6218dd7c2f8d13f0546c2b942cc08
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Thu Nov 5 12:24:14 2015 -0800

    Add aarch64-specific --no-apply-dynamic-relocs option.
    
    With --no-apply-dynamic-relocs on aarch64 targets, gold will not apply
    link-time values for absolute relocations that become dynamic relocations.
    This provides a workaround for broken Android dynamic linkers that use
    the link-time value as an extra addend to the relocation.
    
    gold/
    	PR gold/19163
    	* aarch64.cc (Target_aarch64::Relocate::relocate): Don't apply
    	certain relocations if --no-apply-dynamic-relocs is set.
    	* options.h (--apply-dynamic-relocs): New aarch64-specific option.

Diff:
---
 gold/ChangeLog  |  7 +++++++
 gold/aarch64.cc | 25 +++++++++++++++++++++++++
 gold/options.h  |  5 +++++
 3 files changed, 37 insertions(+)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 5aa49d4..e389438 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,10 @@
+2015-11-05  Cary Coutant  <ccoutant@gmail.com>
+
+	PR gold/19163
+	* aarch64.cc (Target_aarch64::Relocate::relocate): Don't apply
+	certain relocations if --no-apply-dynamic-relocs is set.
+	* options.h (--apply-dynamic-relocs): New aarch64-specific option.
+
 2015-11-03  Alan Modra  <amodra@gmail.com>
 
 	* po/POTFILES.in: Regenerate.
diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index 2dcd620..bc85c83 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -6911,16 +6911,41 @@ Target_aarch64<size, big_endian>::Relocate::relocate(
       break;
 
     case elfcpp::R_AARCH64_ABS64:
+      if (!parameters->options().apply_dynamic_relocs()
+          && parameters->options().output_is_position_independent()
+          && gsym != NULL
+          && gsym->needs_dynamic_reloc(reloc_property->reference_flags())
+          && !gsym->can_use_relative_reloc(false))
+        // We have generated an absolute dynamic relocation, so do not
+        // apply the relocation statically. (Works around bugs in older
+        // Android dynamic linkers.)
+        break;
       reloc_status = Reloc::template rela_ua<64>(
 	view, object, psymval, addend, reloc_property);
       break;
 
     case elfcpp::R_AARCH64_ABS32:
+      if (!parameters->options().apply_dynamic_relocs()
+          && parameters->options().output_is_position_independent()
+          && gsym != NULL
+          && gsym->needs_dynamic_reloc(reloc_property->reference_flags()))
+        // We have generated an absolute dynamic relocation, so do not
+        // apply the relocation statically. (Works around bugs in older
+        // Android dynamic linkers.)
+        break;
       reloc_status = Reloc::template rela_ua<32>(
 	view, object, psymval, addend, reloc_property);
       break;
 
     case elfcpp::R_AARCH64_ABS16:
+      if (!parameters->options().apply_dynamic_relocs()
+          && parameters->options().output_is_position_independent()
+          && gsym != NULL
+          && gsym->needs_dynamic_reloc(reloc_property->reference_flags()))
+        // We have generated an absolute dynamic relocation, so do not
+        // apply the relocation statically. (Works around bugs in older
+        // Android dynamic linkers.)
+        break;
       reloc_status = Reloc::template rela_ua<16>(
 	view, object, psymval, addend, reloc_property);
       break;
diff --git a/gold/options.h b/gold/options.h
index 4d65225..5756014 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -644,6 +644,11 @@ class General_options
 	      N_("Allow unresolved references in shared libraries"),
 	      N_("Do not allow unresolved references in shared libraries"));
 
+  DEFINE_bool(apply_dynamic_relocs, options::TWO_DASHES, '\0', true,
+	      N_("Apply link-time values for dynamic relocations (default)"),
+	      N_("(aarch64 only) Do not apply link-time values "
+	         "for dynamic relocations"));
+
   DEFINE_bool(as_needed, options::TWO_DASHES, '\0', false,
 	      N_("Only set DT_NEEDED for shared libraries if used"),
 	      N_("Always DT_NEEDED for shared libraries"));


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]