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:
Cary Coutant 2014-02-05 22:59:02 -08:00
parent e889f0a4b1
commit 1a221d3d9c
3 changed files with 24 additions and 8 deletions

View file

@ -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.

View file

@ -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.

View file

@ -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())