+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>
     
        Fix problems with the --dynamic-list option.
 
     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.
 
   }
 };
 
+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.
 
        }
 
       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())