diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-09-02 04:14:21 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-09-02 04:17:43 -0700 |
commit | 358de98820c5e9caa222846ba8b646de6cc091c8 (patch) | |
tree | 5fad77fceea123768e3893418af7645f4666910e /gold/resolve.cc | |
parent | d49044c7530d28894e73763c21c417a423e4297c (diff) | |
download | gdb-358de98820c5e9caa222846ba8b646de6cc091c8.zip gdb-358de98820c5e9caa222846ba8b646de6cc091c8.tar.gz gdb-358de98820c5e9caa222846ba8b646de6cc091c8.tar.bz2 |
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.
Diffstat (limited to 'gold/resolve.cc')
-rw-r--r-- | gold/resolve.cc | 8 |
1 files changed, 7 insertions, 1 deletions
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(); |