This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] PR gold/18886: Unnecessary PLT entry for IFUNC function from DSO
- From: Cary Coutant <ccoutant at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Binutils <binutils at sourceware dot org>
- Date: Tue, 1 Sep 2015 18:02:50 -0700
- Subject: Re: [PATCH] PR gold/18886: Unnecessary PLT entry for IFUNC function from DSO
- Authentication-results: sourceware.org; auth=none
- References: <20150830182548 dot GA11499 at intel dot com>
> PR gold/18886
> * resolve.cc (Symbol::override_base): Turn IFUNC symbols from
> shared libraries into normal FUNC symbols.
> ---
> gold/resolve.cc | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/gold/resolve.cc b/gold/resolve.cc
> index 2dcf7b5..dd5b6b6 100644
> --- a/gold/resolve.cc
> +++ b/gold/resolve.cc
> @@ -98,7 +98,13 @@ Symbol::override_base(const elfcpp::Sym<size, big_endian>& sym,
> this->is_ordinary_shndx_ = is_ordinary;
> // Don't override st_type from plugin placeholder symbols.
> if (object->pluginobj() == NULL)
> - this->type_ = sym.get_st_type();
> + {
> + // Turn IFUNC symbols from shared libraries into normal FUNC symbols.
> + elfcpp::STT type = sym.get_st_type();
> + if (object->is_dynamic() && type == elfcpp::STT_GNU_IFUNC)
> + type = elfcpp::STT_FUNC;
> + this->type_ = type;
> + }
> this->binding_ = sym.get_st_bind();
> this->override_visibility(sym.get_st_visibility());
> this->nonvis_ = sym.get_st_nonvis();
In symtab.cc, Symbol_table::sized_write_symbol(), we do this
replacement as we're writing symbols to the output file:
// Turn IFUNC symbols from shared libraries into normal FUNC symbols.
if (type == elfcpp::STT_GNU_IFUNC
&& sym->is_from_dynobj())
type = elfcpp::STT_FUNC;
Since that's being done earlier now, that code should be replaced with:
gold_assert(type != elfcpp::STT_GNU_IFUNC || !sym->is_from_dynobj());
OK with that change. Thanks!
-cary