diff options
Diffstat (limited to 'binutils-2.25/gold')
-rw-r--r-- | binutils-2.25/gold/ChangeLog | 9 | ||||
-rw-r--r-- | binutils-2.25/gold/aarch64.cc | 25 | ||||
-rw-r--r-- | binutils-2.25/gold/options.h | 7 |
3 files changed, 40 insertions, 1 deletions
diff --git a/binutils-2.25/gold/ChangeLog b/binutils-2.25/gold/ChangeLog index 24e87559..bf9cc55c 100644 --- a/binutils-2.25/gold/ChangeLog +++ b/binutils-2.25/gold/ChangeLog @@ -1,4 +1,11 @@ -2015-10.27 Han Shen <shenhan@google.com> +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-10-27 Han Shen <shenhan@google.com> PR gold/19042 - unsupported reloc 311/312. diff --git a/binutils-2.25/gold/aarch64.cc b/binutils-2.25/gold/aarch64.cc index 1148bf7f..1cc68d1e 100644 --- a/binutils-2.25/gold/aarch64.cc +++ b/binutils-2.25/gold/aarch64.cc @@ -6907,16 +6907,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/binutils-2.25/gold/options.h b/binutils-2.25/gold/options.h index 6502e1fc..db5254b8 100644 --- a/binutils-2.25/gold/options.h +++ b/binutils-2.25/gold/options.h @@ -644,6 +644,13 @@ class General_options N_("Allow unresolved references in shared libraries"), N_("Do not allow unresolved references in shared libraries")); + // Note: this is cherry-picked from upstream patch 0eccf19f9. But the default + // value is changed from "true" to "false". + DEFINE_bool(apply_dynamic_relocs, options::TWO_DASHES, '\0', false, + 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")); |