diff options
author | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-09-08 19:26:40 +0200 |
---|---|---|
committer | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-09-08 19:26:40 +0200 |
commit | 2b84c0ca027e029eae1e5f825696d62fa8c4e95f (patch) | |
tree | 08415b3d502063e686db71856e9983ed3f634a22 /binutils-2.25/gold/aarch64.cc | |
parent | 33f0f8829308781a59b094a6ed8c6ad62539b11f (diff) | |
parent | 129dec3ed0e1fc07f75a4322014d770cfd642f4d (diff) | |
download | toolchain_binutils-2b84c0ca027e029eae1e5f825696d62fa8c4e95f.tar.gz toolchain_binutils-2b84c0ca027e029eae1e5f825696d62fa8c4e95f.tar.bz2 toolchain_binutils-2b84c0ca027e029eae1e5f825696d62fa8c4e95f.zip |
Merge branch 'master' of https://android.googlesource.com/toolchain/binutils
Diffstat (limited to 'binutils-2.25/gold/aarch64.cc')
-rw-r--r-- | binutils-2.25/gold/aarch64.cc | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/binutils-2.25/gold/aarch64.cc b/binutils-2.25/gold/aarch64.cc index a62833bf..aa540f0b 100644 --- a/binutils-2.25/gold/aarch64.cc +++ b/binutils-2.25/gold/aarch64.cc @@ -1327,10 +1327,12 @@ Reloc_stub<size, big_endian>::stub_type_for_reloc( if (aarch64_valid_for_adrp_p(location, dest)) return ST_ADRP_BRANCH; - if (parameters->options().output_is_position_independent() - && parameters->options().output_is_executable()) + // Always use PC-relative addressing in case of -shared or -pie. + if (parameters->options().output_is_position_independent()) return ST_LONG_BRANCH_PCREL; + // This saves 2 insns per stub, compared to ST_LONG_BRANCH_PCREL. + // But is only applicable to non-shared or non-pie. return ST_LONG_BRANCH_ABS; } @@ -6907,16 +6909,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; @@ -8180,10 +8207,6 @@ Target_aarch64<size, big_endian>::scan_erratum_843419_span( } if (do_report) { - gold_info(_("Erratum 843419 found and fixed at \"%s\", " - "section %d, offset 0x%08x."), - relobj->name().c_str(), shndx, - (unsigned int)(span_start + offset)); unsigned int erratum_insn_offset = span_start + offset + insn_offset; Address erratum_address = |