aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog6
-rw-r--r--gold/symtab.cc32
2 files changed, 23 insertions, 15 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index b3417b2..5190e7e 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-25 Cary Coutant <ccoutant@gmail.com>
+
+ PR gold/18866
+ PR gold/18703
+ * symtab.cc (Symbol_table): Reorder conditions to avoid internal error.
+
2015-08-20 Alan Modra <amodra@gmail.com>
PR gold/18846
diff --git a/gold/symtab.cc b/gold/symtab.cc
index 7e30fbf..c6b47b0 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -998,26 +998,28 @@ Symbol_table::add_from_object(Object* object,
if (is_default_version)
this->define_default_version<size, big_endian>(ret, insdefault.second,
insdefault.first);
- else if (version != NULL && ret->is_default())
+ else
{
- // We have seen NAME/VERSION already, and marked it as the
- // default version, but now we see a definition for
- // NAME/VERSION that is not the default version. This can
- // happen when the assembler generates two symbols for
- // a symbol as a result of a ".symver foo,foo@VER"
- // directive. We see the first unversioned symbol and
- // we may mark it as the default version (from a
- // version script); then we see the second versioned
- // symbol and we need to override the first.
- // In any other case, the two symbols should have generated
- // a multiple definition error.
- // (See PR gold/18703.)
bool dummy;
- if (ret->source() == Symbol::FROM_OBJECT
+ if (version != NULL
+ && ret->source() == Symbol::FROM_OBJECT
&& ret->object() == object
&& is_ordinary
- && ret->shndx(&dummy) == st_shndx)
+ && ret->shndx(&dummy) == st_shndx
+ && ret->is_default())
{
+ // We have seen NAME/VERSION already, and marked it as the
+ // default version, but now we see a definition for
+ // NAME/VERSION that is not the default version. This can
+ // happen when the assembler generates two symbols for
+ // a symbol as a result of a ".symver foo,foo@VER"
+ // directive. We see the first unversioned symbol and
+ // we may mark it as the default version (from a
+ // version script); then we see the second versioned
+ // symbol and we need to override the first.
+ // In any other case, the two symbols should have generated
+ // a multiple definition error.
+ // (See PR gold/18703.)
ret->set_is_not_default();
const Stringpool::Key vnull_key = 0;
this->table_.erase(std::make_pair(name_key, vnull_key));