diff options
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(); |