diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 2dcd620..723d244 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -6911,16 +6911,38 @@ Target_aarch64::Relocate::relocate( break; case elfcpp::R_AARCH64_ABS64: + if (!parameters->options().apply_dynamic_relocs() + && parameters->options().output_is_position_independent() + && 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->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->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..6ef53cb 100644 --- a/gold/options.h +++ b/gold/options.h @@ -644,6 +644,10 @@ 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_("Write link-time values before dynamic relocations"), + N_("(aarch64 only) Write zeroes for values with 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"));