Fri Jan 29 09:57:58 1993 Ian Lance Taylor (ian@cygnus.com)
authorIan Lance Taylor <ian@airs.com>
Fri, 29 Jan 1993 19:47:56 +0000 (19:47 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 29 Jan 1993 19:47:56 +0000 (19:47 +0000)
* ldmain.c (subfile_wanted_p): If we already have a common
definition of a symbol, don't necessarily pull in an object file
that provides a non-common definition.

ld/ChangeLog
ld/ldmain.c

index d9ea6cb..b7ddaed 100644 (file)
@@ -1,5 +1,9 @@
 Fri Jan 29 09:57:58 1993  Ian Lance Taylor  (ian@cygnus.com)
 
+       * ldmain.c (subfile_wanted_p): If we already have a common
+       definition of a symbol, don't necessarily pull in an object file
+       that provides a non-common definition.
+
        * ldlex.l (COMMAND): Accept -EB and -EL command line arguments,
        returning OPTION_EB and OPTION_EL.  gcc passes these to a MIPS
        linker.
index 207b604..767999b 100644 (file)
@@ -958,9 +958,15 @@ subfile_wanted_p (entry)
              if (sp->srefs_chain != (asymbol **) NULL
                  || sp->scoms_chain != (asymbol **) NULL)
                {
-                 /* This is a symbol we are looking for.  It is either
-                    not yet defined or common.  */
-
+                 /* This is a symbol we are looking for.  It is
+                    either not yet defined or common.  If this is a
+                    common symbol, then if the symbol in the object
+                    file is common, we need to combine sizes.  But if
+                    we already have a common symbol, and the symbol
+                    in the object file is not common, we don't want
+                    the object file: it is providing a definition for
+                    a symbol that we already have a definition for
+                    (this is the else condition below).  */
                  if (bfd_is_com_section (p->section))
                    {
 
@@ -1017,8 +1023,7 @@ subfile_wanted_p (entry)
                        }
                      ASSERT (p->udata == 0);
                    }
-
-                 else
+                 else if (sp->scoms_chain == (asymbol **) NULL)
                    {
                      if (write_map)
                        {