From: Han Shen Date: Fri, 6 May 2016 22:07:13 +0000 (-0700) Subject: Fix for PR gold/19987. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5c28a5038108d75652e1ee9753aa2f1ffe8176db;p=binutils-gdb.git Fix for PR gold/19987. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index fb276638775..0bc160aaa86 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2016-05-06 Han Shen + + PR gold/19987. + + * aarch64-reloc.def: New relocation type. + * aarch64.cc (AArch64_relocate_functions::Page): Changed to public. + (Target_aarch64::Scan::local): Add R_AARCH64_LD64_GOTPAGE_LO15. + (Target_aarch64::Scan::global): Add R_AARCH64_LD64_GOTPAGE_LO15. + (Target_aarch64::Relocate::relocate): Implement R_AARCH64_LD64_GOTPAGE_LO15. + 2016-04-28 Nick Clifton * po/zh_CN.po: Updated Chinese (simplified) translation. diff --git a/gold/aarch64-reloc.def b/gold/aarch64-reloc.def index 93c465d191b..f33929b4e85 100644 --- a/gold/aarch64-reloc.def +++ b/gold/aarch64-reloc.def @@ -54,6 +54,7 @@ ARD(LDST128_ABS_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHEC ARD(ADR_GOT_PAGE , STATIC , AARCH64 , Y, -1, 32,32 , 12,32 , Symbol::RELATIVE_REF , ADRP ) ARD(LD64_GOT_LO12_NC , STATIC , AARCH64 , Y, -1, 0,RL_CHECK_ALIGN8 , 3,11 , Symbol::ABSOLUTE_REF , LDST ) +ARD(LD64_GOTPAGE_LO15 , STATIC , AARCH64 , Y, -1, 0,15 , 3,14 , Symbol::RELATIVE_REF , LDST ) // Above 2 relocs are from Table 4-14, GOT-relative instruction relocations. (Some relocs in the table are not implemented yet.) ARD(TSTBR14 , STATIC , CFLOW , N, -1, 15,15 , 2,15 , (Symbol::FUNCTION_CALL|Symbol::ABSOLUTE_REF) , TBZNZ ) diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 01868c7cc9f..75e4177c7e9 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -5106,6 +5106,8 @@ class AArch64_relocate_functions static_cast(val | (immed << doffset))); } + public: + // Update selected bits in text. template @@ -5133,8 +5135,6 @@ class AArch64_relocate_functions : This::STATUS_OVERFLOW); } - public: - // Construct a B insn. Note, although we group it here with other relocation // operation, there is actually no 'relocation' involved here. static inline void @@ -6001,7 +6001,8 @@ Target_aarch64::Scan::local( case elfcpp::R_AARCH64_ADR_GOT_PAGE: case elfcpp::R_AARCH64_LD64_GOT_LO12_NC: - // This pair of relocations is used to access a specific GOT entry. + case elfcpp::R_AARCH64_LD64_GOTPAGE_LO15: + // The above relocations are used to access GOT entries. { bool is_new = false; // This symbol requires a GOT entry. @@ -6326,8 +6327,9 @@ Target_aarch64::Scan::global( case elfcpp::R_AARCH64_ADR_GOT_PAGE: case elfcpp::R_AARCH64_LD64_GOT_LO12_NC: + case elfcpp::R_AARCH64_LD64_GOTPAGE_LO15: { - // This pair of relocations is used to access a specific GOT entry. + // The above relocations are used to access GOT entries. // Note a GOT entry is an *address* to a symbol. // The symbol requires a GOT entry Output_data_got_aarch64* got = @@ -7045,6 +7047,19 @@ Target_aarch64::Relocate::relocate( view, value, addend, reloc_property); break; + case elfcpp::R_AARCH64_LD64_GOTPAGE_LO15: + { + gold_assert(have_got_offset); + value = target->got_->address() + got_base + got_offset + addend - + Reloc::Page(target->got_->address() + got_base); + if ((value & 7) != 0) + reloc_status = Reloc::STATUS_OVERFLOW; + else + reloc_status = Reloc::template reloc_common<32>( + view, value, reloc_property); + break; + } + case elfcpp::R_AARCH64_TLSGD_ADR_PAGE21: case elfcpp::R_AARCH64_TLSGD_ADD_LO12_NC: case elfcpp::R_AARCH64_TLSLD_ADR_PAGE21: