PR ld/20276: Set non_ir_ref on common symbol
[deliverable/binutils-gdb.git] / ld / plugin.c
index cb6131841d61ca26c02c95037701fd11ae013582..4c161d1796c0d61d4b980e4a86338282a9bd3521 100644 (file)
@@ -1325,20 +1325,30 @@ plugin_notice (struct bfd_link_info *info,
          h->non_ir_ref = TRUE;
        }
 
-      /* Otherwise, it must be a new def.  Ensure any symbol defined
-        in an IR dummy BFD takes on a new value from a real BFD.
-        Weak symbols are not normally overridden by a new weak
-        definition, and strong symbols will normally cause multiple
-        definition errors.  Avoid this by making the symbol appear
-        to be undefined.  */
-      else if (((h->type == bfd_link_hash_defweak
-                || h->type == bfd_link_hash_defined)
-               && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
-              || (h->type == bfd_link_hash_common
-                  && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
+      /* Otherwise, it must be a new def.  */
+      else
        {
-         h->type = bfd_link_hash_undefweak;
-         h->u.undef.abfd = sym_bfd;
+         /* A common symbol should be merged with other commons or
+            defs with the same name.  In particular, a common ought
+            to be overridden by a def in a -flto object.  In that
+            sense a common is also a ref.  */
+         if (bfd_is_com_section (section))
+           h->non_ir_ref = TRUE;
+
+         /* Ensure any symbol defined in an IR dummy BFD takes on a
+            new value from a real BFD.  Weak symbols are not normally
+            overridden by a new weak definition, and strong symbols
+            will normally cause multiple definition errors.  Avoid
+            this by making the symbol appear to be undefined.  */
+         if (((h->type == bfd_link_hash_defweak
+               || h->type == bfd_link_hash_defined)
+              && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
+             || (h->type == bfd_link_hash_common
+                 && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
+           {
+             h->type = bfd_link_hash_undefweak;
+             h->u.undef.abfd = sym_bfd;
+           }
        }
     }
 
This page took 0.02447 seconds and 4 git commands to generate.