Better multiple definition errors.
authorIan Lance Taylor <iant@google.com>
Sun, 14 Oct 2007 07:10:20 +0000 (07:10 +0000)
committerIan Lance Taylor <iant@google.com>
Sun, 14 Oct 2007 07:10:20 +0000 (07:10 +0000)
gold/resolve.cc
gold/symtab.h

index 54529d1e93ada598bf1859ab839fcf2553611bcd..b890ed0952c1e1a949b60a19a72503250744008f 100644 (file)
@@ -170,7 +170,8 @@ Symbol_table::resolve(Sized_symbol<size>* to,
     }
 
   bool adjust_common_sizes;
-  if (Symbol_table::should_override(to, frombits, &adjust_common_sizes))
+  if (Symbol_table::should_override(to, frombits, object,
+                                   &adjust_common_sizes))
     {
       typename Sized_symbol<size>::Size_type tosize = to->symsize();
 
@@ -195,7 +196,7 @@ Symbol_table::resolve(Sized_symbol<size>* to,
 
 bool
 Symbol_table::should_override(const Symbol* to, unsigned int frombits,
-                              bool* adjust_common_sizes)
+                              Object* object, bool* adjust_common_sizes)
 {
   *adjust_common_sizes = false;
 
@@ -276,8 +277,14 @@ Symbol_table::should_override(const Symbol* to, unsigned int frombits,
     {
     case DEF * 16 + DEF:
       // Two definitions of the same symbol.
-      // FIXME: Report locations.
-      gold_error(_("multiple definition of %s"), to->name());
+      // FIXME: Do a better job of reporting locations.
+      gold_error(_("%s: multiple definition of %s"),
+                object != NULL ? object->name().c_str() : _("command line"),
+                to->name());
+      gold_error(_("%s: previous definition here"),
+                (to->source() == Symbol::FROM_OBJECT
+                 ? to->object()->name().c_str()
+                 : _("command line")));
       return false;
 
     case WEAK_DEF * 16 + DEF:
@@ -573,7 +580,8 @@ Symbol_table::should_override_with_special(const Symbol* to)
 {
   bool adjust_common_sizes;
   unsigned int frombits = global_flag | regular_flag | def_flag;
-  bool ret = Symbol_table::should_override(to, frombits, &adjust_common_sizes);
+  bool ret = Symbol_table::should_override(to, frombits, NULL,
+                                          &adjust_common_sizes);
   gold_assert(!adjust_common_sizes);
   return ret;
 }
index 58c0e50ccf7861bf8354ba070a6c7e98d2581a7e..b215f5d58eb1682f774b2411aa4eec5015b5d47d 100644 (file)
@@ -944,7 +944,7 @@ class Symbol_table
   // Whether we should override a symbol, based on flags in
   // resolve.cc.
   static bool
-  should_override(const Symbol*, unsigned int, bool*);
+  should_override(const Symbol*, unsigned int, Object*, bool*);
 
   // Whether we should override a symbol with a special symbol which
   // is automatically defined by the linker.