Don't override definition a shared object by one in a later shared object.
In PR 16979, a reference to malloc is being resolved to an unversioned reference in libmalloc.so. When linked with --as-needed, however, the dynamic table does not list libmalloc.so as a DT_NEEDED library. If we have a reference to an unversioned symbol in a shared object, and we later see a versioned definition in another shared object, we were overriding the first definition with the second in the process of defining the default version. As a result, we no longer think that the first shared object was actually needed to resolve any symbols, and we don't list it as a DT_NEEDED library. This patch fixes the problem by treating the two definitions as separate symbols, so the second definition does not override the first. 2016-03-30 Cary Coutant <ccoutant@gmail.com> gold/ PR gold/16979 * symtab.cc (Symbol_table::define_default_version): Check for case where symbols are both in different shared objects.
This commit is contained in:
parent
69b51e106d
commit
b60ecbc6dd
@ -1,3 +1,9 @@
|
|||||||
|
2016-03-30 Cary Coutant <ccoutant@gmail.com>
|
||||||
|
|
||||||
|
PR gold/16979
|
||||||
|
* symtab.cc (Symbol_table::define_default_version): Check for case
|
||||||
|
where symbols are both in different shared objects.
|
||||||
|
|
||||||
2016-03-27 Cary Coutant <ccoutant@gmail.com>
|
2016-03-27 Cary Coutant <ccoutant@gmail.com>
|
||||||
|
|
||||||
PR gold/16111
|
PR gold/16111
|
||||||
|
@ -865,6 +865,9 @@ Symbol_table::define_default_version(Sized_symbol<size>* sym,
|
|||||||
// other is defined in a shared object, then they are different
|
// other is defined in a shared object, then they are different
|
||||||
// symbols.
|
// symbols.
|
||||||
|
|
||||||
|
// If the two symbols are from different shared objects,
|
||||||
|
// they are different symbols.
|
||||||
|
|
||||||
// Otherwise, we just resolve the symbols as though they were
|
// Otherwise, we just resolve the symbols as though they were
|
||||||
// the same.
|
// the same.
|
||||||
|
|
||||||
@ -876,6 +879,10 @@ Symbol_table::define_default_version(Sized_symbol<size>* sym,
|
|||||||
else if (pdef->second->visibility() != elfcpp::STV_DEFAULT
|
else if (pdef->second->visibility() != elfcpp::STV_DEFAULT
|
||||||
&& sym->is_from_dynobj())
|
&& sym->is_from_dynobj())
|
||||||
;
|
;
|
||||||
|
else if (pdef->second->is_from_dynobj()
|
||||||
|
&& sym->is_from_dynobj()
|
||||||
|
&& pdef->second->object() != sym->object())
|
||||||
|
;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const Sized_symbol<size>* symdef;
|
const Sized_symbol<size>* symdef;
|
||||||
|
Loading…
Reference in New Issue
Block a user