From e977e74712cf8df6ff44ead0a5c0ffd3cb9aa065 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 1 May 2020 08:53:47 -0700 Subject: [PATCH] gold: Handle local IFUNC symbol for APLT Handle local IFUNC symbol for APLT like global IFUNC symbol. PR gold/25872 * x86_64.cc (Output_data_plt_x86_64_bnd::do_address_for_local): Handle local IFUNC symbol. (Output_data_plt_x86_64_ibt::do_address_for_local): Likewise. --- gold/ChangeLog | 7 +++++++ gold/x86_64.cc | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 4466f4d1dfa..cc62a3e8275 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2020-05-01 H.J. Lu + + PR gold/25872 + * x86_64.cc (Output_data_plt_x86_64_bnd::do_address_for_local): + Handle local IFUNC symbol. + (Output_data_plt_x86_64_ibt::do_address_for_local): Likewise. + 2020-03-19 Fangrui Song * options.h (General_options): Add --no-rosegment option. diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 8b6027e72c3..6219c8e306f 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -2086,7 +2086,12 @@ Output_data_plt_x86_64_bnd::do_address_for_local(const Relobj* object, unsigned int r_sym) { // Convert the PLT offset into an APLT offset. - unsigned int plt_offset = ((object->local_plt_offset(r_sym) - plt_entry_size) + const Sized_relobj_file<64, false>* sized_relobj = + static_cast*>(object); + const Symbol_value<64>* psymval = sized_relobj->local_symbol(r_sym); + unsigned int plt_offset = ((object->local_plt_offset(r_sym) + - (psymval->is_ifunc_symbol() + ? 0 : plt_entry_size)) / (plt_entry_size / aplt_entry_size)); return (this->address() + this->aplt_offset_ @@ -2260,7 +2265,12 @@ Output_data_plt_x86_64_ibt::do_address_for_local(const Relobj* object, unsigned int r_sym) { // Convert the PLT offset into an APLT offset. - unsigned int plt_offset = ((object->local_plt_offset(r_sym) - plt_entry_size) + const Sized_relobj_file* sized_relobj = + static_cast*>(object); + const Symbol_value* psymval = sized_relobj->local_symbol(r_sym); + unsigned int plt_offset = ((object->local_plt_offset(r_sym) + - (psymval->is_ifunc_symbol() + ? 0 : plt_entry_size)) / (plt_entry_size / aplt_entry_size)); return (this->address() + this->aplt_offset_ -- 2.30.2