Fix issues with gold undefined symbol diagnostics.
PR binutils/15435 complains that gold issues a visibility error for an weak undefined symbol with hidden visibility. The message should be suppressed if the symbol is a weak undef. An earlier patch to add an extra note about key functions when a class's vtable symbol is undefined missed a case where the reference to the vtable came from a shared library. This patch moves the check to a lower-level routine that catches both cases. gold/ 2014-02-05 Cary Coutant <ccoutant@google.com> * errors.cc (Errors::undefined_symbol): Move undef vtable symbol check to here. * target-reloc.h (is_strong_undefined): New function. (relocate_section): Move undef vtable symbol check from here. Check for is_strong_undefined.
This commit is contained in:
parent
e889f0a4b1
commit
1a221d3d9c
3 changed files with 24 additions and 8 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
2014-02-05 Cary Coutant <ccoutant@google.com>
|
||||||
|
|
||||||
|
Fix issues with gold undefined symbol diagnostics.
|
||||||
|
|
||||||
|
PR binutils/15435
|
||||||
|
* errors.cc (Errors::undefined_symbol): Move undef vtable symbol
|
||||||
|
check to here.
|
||||||
|
* target-reloc.h (is_strong_undefined): New function.
|
||||||
|
(relocate_section): Move undef vtable symbol check from here.
|
||||||
|
Check for is_strong_undefined.
|
||||||
|
|
||||||
2014-02-05 Cary Coutant <ccoutant@google.com>
|
2014-02-05 Cary Coutant <ccoutant@google.com>
|
||||||
|
|
||||||
Fix problems with the --dynamic-list option.
|
Fix problems with the --dynamic-list option.
|
||||||
|
|
|
@ -193,6 +193,11 @@ Errors::undefined_symbol(const Symbol* sym, const std::string& location)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
_("%s: %s: undefined reference to '%s', version '%s'\n"),
|
_("%s: %s: undefined reference to '%s', version '%s'\n"),
|
||||||
location.c_str(), zmsg, sym->demangled_name().c_str(), version);
|
location.c_str(), zmsg, sym->demangled_name().c_str(), version);
|
||||||
|
|
||||||
|
if (sym->is_cxx_vtable())
|
||||||
|
gold_info(_("%s: the vtable symbol may be undefined because "
|
||||||
|
"the class is missing its key function"),
|
||||||
|
program_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Issue a debugging message.
|
// Issue a debugging message.
|
||||||
|
|
|
@ -144,6 +144,12 @@ class Default_comdat_behavior
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
is_strong_undefined(const Symbol* sym)
|
||||||
|
{
|
||||||
|
return sym->is_undefined() && sym->binding() != elfcpp::STB_WEAK;
|
||||||
|
}
|
||||||
|
|
||||||
// Give an error for a symbol with non-default visibility which is not
|
// Give an error for a symbol with non-default visibility which is not
|
||||||
// defined locally.
|
// defined locally.
|
||||||
|
|
||||||
|
@ -411,16 +417,10 @@ relocate_section(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issue_undefined_symbol_error(sym))
|
if (issue_undefined_symbol_error(sym))
|
||||||
{
|
gold_undefined_symbol_at_location(sym, relinfo, i, offset);
|
||||||
gold_undefined_symbol_at_location(sym, relinfo, i, offset);
|
|
||||||
if (sym->is_cxx_vtable())
|
|
||||||
gold_info(_("%s: the vtable symbol may be undefined because "
|
|
||||||
"the class is missing its key function"),
|
|
||||||
program_name);
|
|
||||||
}
|
|
||||||
else if (sym != NULL
|
else if (sym != NULL
|
||||||
&& sym->visibility() != elfcpp::STV_DEFAULT
|
&& sym->visibility() != elfcpp::STV_DEFAULT
|
||||||
&& (sym->is_undefined() || sym->is_from_dynobj()))
|
&& (is_strong_undefined(sym) || sym->is_from_dynobj()))
|
||||||
visibility_error(sym);
|
visibility_error(sym);
|
||||||
|
|
||||||
if (sym != NULL && sym->has_warning())
|
if (sym != NULL && sym->has_warning())
|
||||||
|
|
Loading…
Reference in a new issue