PR 10979
[deliverable/binutils-gdb.git] / gold / common.cc
index c4ff047d47a96651ba452d98c2a6ab63477f2f8d..885933807c62d0f62568170aef147667fb31fa89 100644 (file)
@@ -91,7 +91,16 @@ bool
 Sort_commons<size>::operator()(const Symbol* pa, const Symbol* pb) const
 {
   if (pa == NULL)
-    return false;
+    {
+      if (pb == NULL)
+       {
+         // Stabilize sort.  The order really doesn't matter, because
+         // these entries will be discarded, but we want to return
+         // the same result every time we compare pa and pb.
+         return pa < pb;
+       }
+      return false;
+    }
   if (pb == NULL)
     return true;
 
@@ -312,6 +321,17 @@ Symbol_table::do_allocate_commons_list(
       Symbol* sym = *p;
       if (sym == NULL)
        break;
+
+      // Because we followed forwarding symbols above, but we didn't
+      // do it reliably before adding symbols to the list, it is
+      // possible for us to have the same symbol on the list twice.
+      // This can happen in the horrible case where a program defines
+      // a common symbol with the same name as a versioned libc
+      // symbol.  That will show up here as a symbol which has already
+      // been allocated and is therefore no longer a common symbol.
+      if (!sym->is_common())
+       continue;
+
       Sized_symbol<size>* ssym = this->get_sized_symbol<size>(sym);
 
       // Record the symbol in the map file now, before we change its
This page took 0.023814 seconds and 4 git commands to generate.