* script.cc (Version_script_info::build_expression_list_lookup):
authorIan Lance Taylor <ian@airs.com>
Sat, 9 Jan 2010 05:49:57 +0000 (05:49 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 9 Jan 2010 05:49:57 +0000 (05:49 +0000)
Don't warn about ambiguous version, just record the ambiguity.
(Version_script_info::get_symbol_version_helper): Give error if
version is ambiguous.

gold/ChangeLog
gold/script.cc

index 18a465b96db40d125200e4394de29502fd379c4e..a92796ab8aa0200695015e31f884d9937e24c0d6 100644 (file)
@@ -1,3 +1,10 @@
+2010-01-08  Ian Lance Taylor  <iant@google.com>
+
+       * script.cc (Version_script_info::build_expression_list_lookup):
+       Don't warn about ambiguous version, just record the ambiguity.
+       (Version_script_info::get_symbol_version_helper): Give error if
+       version is ambiguous.
+
 2010-01-08  Doug Kwan  <dougkwan@google.com>
 
        * arm.cc (Stub_table::Stub_table): Initalize cortex_a8_stubs_,
index 423904054726b4a352a42cae97df19ad372be3c6..ce0605206b1a2905a1d357555eb6214fd49f6d04 100644 (file)
@@ -1957,11 +1957,13 @@ Version_script_info::build_expression_list_lookup(
          if (!ins.second)
            {
              const Version_tree* v1 = ins.first->second;
-             if (v1->tag != v->tag)
-               gold_error(_("'%s' appears in version script with both "
-                            "versions '%s' and '%s'"),
-                          exp.pattern.c_str(), v1->tag.c_str(),
-                          v->tag.c_str());
+             if (v1 != NULL && v1->tag != v->tag)
+               {
+                 // This is an ambiguous match.  It's OK if it's just
+                 // documenting symbol versions, but not if we look
+                 // up this symbol.
+                 ins.first->second = NULL;
+               }
            }
        }
     }
@@ -2037,7 +2039,16 @@ Version_script_info::get_symbol_version_helper(const char* symbol_name,
       if (pe != lookup->exact.end())
        {
          if (pversion != NULL)
-           *pversion = pe->second->tag;
+           {
+             if (pe->second != NULL)
+               *pversion = pe->second->tag;
+             else
+               {
+                 gold_error(_("'%s' has multiple versions in version script"),
+                            name_to_match);
+                 return false;
+               }
+           }
 
          // If we are using --no-undefined-version, and this is a
          // global symbol, we have to record that we have found this