From 4d2f5d5824be99326c2c3e459c298e338856d8c8 Mon Sep 17 00:00:00 2001 From: Han Shen Date: Tue, 27 Oct 2015 15:17:54 -0700 Subject: [PATCH] Patch for PR gold/19042 - unsupported reloc 311/312. gold/ * aarch64.cc (Target_aarch64::Scan::local): Add support for reloc 311/312. --- gold/ChangeLog | 7 +++++++ gold/aarch64.cc | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/gold/ChangeLog b/gold/ChangeLog index 46a0636d8e6..dc1c0ea2e2f 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2015-10.27 Han Shen + + PR gold/19042 - unsupported reloc 311/312. + + * aarch64.cc (Target_aarch64::Scan::local): Add support for + reloc 311/312. + 2015-10-22 H.J. Lu * x86_64.cc (Target_x86_64::Scan::get_reference_flags): diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 2e3c42afdaa..275d94c308a 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -5987,6 +5987,29 @@ Target_aarch64::Scan::local( case elfcpp::R_AARCH64_PREL16: break; + 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. + { + bool is_new = false; + // This symbol requires a GOT entry. + if (is_ifunc) + is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD); + else + is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD); + if (is_new && parameters->options().output_is_position_independent()) + target->rela_dyn_section(layout)-> + add_local_relative(object, + r_sym, + elfcpp::R_AARCH64_RELATIVE, + got, + object->local_got_offset(r_sym, + GOT_TYPE_STANDARD), + 0, + false); + } + break; + case elfcpp::R_AARCH64_LD_PREL_LO19: // 273 case elfcpp::R_AARCH64_ADR_PREL_LO21: // 274 case elfcpp::R_AARCH64_ADR_PREL_PG_HI21: // 275 -- 2.30.2