[PATCH] gold: Handle local IFUNC symbol for APLT

H.J. Lu hjl.tools@gmail.com
Fri May 1 15:50:34 GMT 2020


On Sat, Apr 25, 2020 at 8:24 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> 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/x86_64.cc | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/gold/x86_64.cc b/gold/x86_64.cc
> index 1442a009d7..b094e4bd3b 100644
> --- a/gold/x86_64.cc
> +++ b/gold/x86_64.cc
> @@ -2114,7 +2114,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<const Sized_relobj_file<64, false>*>(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_
> @@ -2288,7 +2293,12 @@ Output_data_plt_x86_64_ibt<size>::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<size, false>* sized_relobj =
> +    static_cast<const Sized_relobj_file<size, false>*>(object);
> +  const Symbol_value<size>* 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.25.3
>

I am checking in this patch.

-- 
H.J.


More information about the Binutils mailing list