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.
This commit is contained in:
Cary Coutant 2015-11-05 12:24:14 -08:00
parent c86a40c6c2
commit 0eccf19f96
3 changed files with 37 additions and 0 deletions

View file

@ -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.

View file

@ -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;

View file

@ -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"));