PR 10980
authorIan Lance Taylor <ian@airs.com>
Tue, 5 Jan 2010 05:56:28 +0000 (05:56 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 5 Jan 2010 05:56:28 +0000 (05:56 +0000)
* options.h (class General_options): Add
--allow-multiple-definition and -z muldefs.
* resolve.cc (Symbol_table::should_override): Don't warn about a
multiple symbol definition if --allow-multiple-definition or -z
muldefs.

gold/ChangeLog
gold/options.h
gold/resolve.cc

index 6d36ca7680664fac70ec73c5550d0312a84e54dc..934cba3b5fe529a9fcd684f846518b02e40f00cf 100644 (file)
@@ -1,5 +1,12 @@
 2010-01-04  Ian Lance Taylor  <iant@google.com>
 
+       PR 10980
+       * options.h (class General_options): Add
+       --allow-multiple-definition and -z muldefs.
+       * resolve.cc (Symbol_table::should_override): Don't warn about a
+       multiple symbol definition if --allow-multiple-definition or -z
+       muldefs.
+
        PR 10980
        * options.h (class General_options): Add --add-needed and
        --copy-dt-needed-entries.  Tweak --as-needed help entry.
index f6549ab104d76e9ba77789de7aecedd289baf67a..08c5fdc62693d6b8da70de2b50958ad1d794da1c 100644 (file)
@@ -584,6 +584,10 @@ class General_options
              N_("Not supported"),
              N_("Do not copy DT_NEEDED tags from shared libraries"));
 
+  DEFINE_bool(allow_multiple_definition, options::TWO_DASHES, '\0', false,
+             N_("Allow multiple definitions of symbols"),
+             N_("Do not allow multiple definitions"));
+
   DEFINE_bool(allow_shlib_undefined, options::TWO_DASHES, '\0', false,
               N_("Allow unresolved references in shared libraries"),
               N_("Do not allow unresolved references in shared libraries"));
@@ -998,6 +1002,11 @@ class General_options
              NULL);
   DEFINE_uint64(max_page_size, options::DASH_Z, '\0', 0,
                 N_("Set maximum page size to SIZE"), N_("SIZE"));
+  DEFINE_bool(muldefs, options::DASH_Z, '\0', false,
+             N_("Allow multiple definitions of symbols"),
+             NULL);
+  // copyreloc is here in the list because there is only -z
+  // nocopyreloc, not -z copyreloc.
   DEFINE_bool(copyreloc, options::DASH_Z, '\0', true,
              NULL,
              N_("Do not create copy relocs"));
index d32b2b9712b0cfabc0d5c919a37e6486004a96ce..24b80a8a57504b8b878c412f052a7f39e9064264 100644 (file)
@@ -440,9 +440,11 @@ Symbol_table::should_override(const Symbol* to, unsigned int frombits,
           || (object != NULL && object->just_symbols()))
         return false;
 
-      Symbol_table::report_resolve_problem(true,
-                                          _("multiple definition of '%s'"),
-                                          to, defined, object);
+      if (!parameters->options().allow_multiple_definition()
+         && !parameters->options().muldefs())
+       Symbol_table::report_resolve_problem(true,
+                                            _("multiple definition of '%s'"),
+                                            to, defined, object);
       return false;
 
     case WEAK_DEF * 16 + DEF: