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:
parent
d49044c753
commit
358de98820
3 changed files with 16 additions and 5 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue