Turn IFUNC symbols from shared libraries into normal FUNC symbols

Turn IFUNC symbols from shared libraries into normal FUNC symbols when
we are resolving symbol references, instead of when we are writing out
the symbol table.

	PR gold/18886
	* resolve.cc (Symbol::override_base): Turn IFUNC symbols from
	shared libraries into normal FUNC symbols.
	* symtab.cc (Symbol_table::sized_write_symbol): Assert IFUNC
	symbols aren't from shared libraries.
This commit is contained in:
H.J. Lu 2015-09-02 04:14:21 -07:00
parent d49044c753
commit 358de98820
3 changed files with 16 additions and 5 deletions

View file

@ -1,3 +1,11 @@
2015-09-02 H.J. Lu <hongjiu.lu@intel.com>
PR gold/18886
* resolve.cc (Symbol::override_base): Turn IFUNC symbols from
shared libraries into normal FUNC symbols.
* symtab.cc (Symbol_table::sized_write_symbol): Assert IFUNC
symbols aren't from shared libraries.
2015-09-02 Alan Modra <amodra@gmail.com>
PR 18878

View file

@ -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();

View file

@ -3130,10 +3130,7 @@ Symbol_table::sized_write_symbol(
else
osym.put_st_size(sym->symsize());
elfcpp::STT type = sym->type();
// Turn IFUNC symbols from shared libraries into normal FUNC symbols.
if (type == elfcpp::STT_GNU_IFUNC
&& sym->is_from_dynobj())
type = elfcpp::STT_FUNC;
gold_assert(type != elfcpp::STT_GNU_IFUNC || !sym->is_from_dynobj());
// A version script may have overridden the default binding.
if (sym->is_forced_local())
osym.put_st_info(elfcpp::elf_st_info(elfcpp::STB_LOCAL, type));