this->undef_binding_set_ = false;
this->undef_binding_weak_ = false;
this->is_predefined_ = false;
+ this->is_protected_ = false;
}
// Return the demangled version of the symbol's name, but only
// other is defined in a shared object, then they are different
// symbols.
+ // If the two symbols are from different shared objects,
+ // they are different symbols.
+
// Otherwise, we just resolve the symbols as though they were
// the same.
else if (pdef->second->visibility() != elfcpp::STV_DEFAULT
&& sym->is_from_dynobj())
;
+ else if (pdef->second->is_from_dynobj()
+ && sym->is_from_dynobj()
+ && pdef->second->is_defined()
+ && pdef->second->object() != sym->object())
+ ;
else
{
const Sized_symbol<size>* symdef;
res = this->add_from_object(relobj, name, name_key, ver, ver_key,
is_default_version, *psym, st_shndx,
is_ordinary, orig_st_shndx);
+
+ if (res == NULL)
+ continue;
if (is_forced_local)
this->force_local(res);
is_default_version, *sym, st_shndx,
is_ordinary, st_shndx);
+ if (res == NULL)
+ return NULL;
+
if (is_forced_local)
this->force_local(res);
}
}
+ if (res == NULL)
+ continue;
+
// Note that it is possible that RES was overridden by an
// earlier object, in which case it can't be aliased here.
if (st_shndx != elfcpp::SHN_UNDEF
&& res->object() == dynobj)
object_symbols.push_back(res);
+ // If the symbol has protected visibility in the dynobj,
+ // mark it as such if it was not overridden.
+ if (res->source() == Symbol::FROM_OBJECT
+ && res->object() == dynobj
+ && sym.get_st_visibility() == elfcpp::STV_PROTECTED)
+ res->set_is_protected();
+
if (sympointers != NULL)
(*sympointers)[i] = res;
}
Stringpool::Key ver_key = 0;
bool is_default_version = false;
- bool is_forced_local = false;
Stringpool::Key name_key;
name = this->namepool_.add(name, true, &name_key);
is_default_version, *sym, st_shndx,
is_ordinary, st_shndx);
- if (is_forced_local)
- this->force_local(res);
-
return res;
}