diff options
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/aarch64.cc | 23 |
2 files changed, 30 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 46a0636..dc1c0ea 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2015-10.27 Han Shen <shenhan@google.com> + + 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 <hongjiu.lu@intel.com> * x86_64.cc (Target_x86_64<size>::Scan::get_reference_flags): diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 2e3c42a..275d94c 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -5987,6 +5987,29 @@ Target_aarch64<size, big_endian>::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 |