From: Cary Coutant Date: Thu, 6 Feb 2014 06:59:02 +0000 (-0800) Subject: Fix issues with gold undefined symbol diagnostics. X-Git-Tag: gdb-7.8-release~1409 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1a221d3d9cc474b8a382f6aeed56671d10b71473;p=external%2Fbinutils.git 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 * 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index a6b8458..5996f3e 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,4 +1,15 @@ 2014-02-05 Cary Coutant + + 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 Fix problems with the --dynamic-list option. diff --git a/gold/errors.cc b/gold/errors.cc index b79764b..98db0fd 100644 --- a/gold/errors.cc +++ b/gold/errors.cc @@ -193,6 +193,11 @@ Errors::undefined_symbol(const Symbol* sym, const std::string& location) fprintf(stderr, _("%s: %s: undefined reference to '%s', version '%s'\n"), 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. diff --git a/gold/target-reloc.h b/gold/target-reloc.h index b544c78..d609bcb 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -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 // defined locally. @@ -411,16 +417,10 @@ relocate_section( } if (issue_undefined_symbol_error(sym)) - { - 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); - } + gold_undefined_symbol_at_location(sym, relinfo, i, offset); else if (sym != NULL && sym->visibility() != elfcpp::STV_DEFAULT - && (sym->is_undefined() || sym->is_from_dynobj())) + && (is_strong_undefined(sym) || sym->is_from_dynobj())) visibility_error(sym); if (sym != NULL && sym->has_warning())