Better multiple definition errors.

This commit is contained in:
Ian Lance Taylor 2007-10-14 07:10:20 +00:00
parent a0c4fb0ac6
commit d20222a1e7
2 changed files with 14 additions and 6 deletions

View File

@ -170,7 +170,8 @@ Symbol_table::resolve(Sized_symbol<size>* to,
} }
bool adjust_common_sizes; 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(); typename Sized_symbol<size>::Size_type tosize = to->symsize();
@ -195,7 +196,7 @@ Symbol_table::resolve(Sized_symbol<size>* to,
bool bool
Symbol_table::should_override(const Symbol* to, unsigned int frombits, Symbol_table::should_override(const Symbol* to, unsigned int frombits,
bool* adjust_common_sizes) Object* object, bool* adjust_common_sizes)
{ {
*adjust_common_sizes = false; *adjust_common_sizes = false;
@ -276,8 +277,14 @@ Symbol_table::should_override(const Symbol* to, unsigned int frombits,
{ {
case DEF * 16 + DEF: case DEF * 16 + DEF:
// Two definitions of the same symbol. // Two definitions of the same symbol.
// FIXME: Report locations. // FIXME: Do a better job of reporting locations.
gold_error(_("multiple definition of %s"), to->name()); 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; return false;
case WEAK_DEF * 16 + DEF: case WEAK_DEF * 16 + DEF:
@ -573,7 +580,8 @@ Symbol_table::should_override_with_special(const Symbol* to)
{ {
bool adjust_common_sizes; bool adjust_common_sizes;
unsigned int frombits = global_flag | regular_flag | def_flag; 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); gold_assert(!adjust_common_sizes);
return ret; return ret;
} }

View File

@ -944,7 +944,7 @@ class Symbol_table
// Whether we should override a symbol, based on flags in // Whether we should override a symbol, based on flags in
// resolve.cc. // resolve.cc.
static bool 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 // Whether we should override a symbol with a special symbol which
// is automatically defined by the linker. // is automatically defined by the linker.