Warn when a script redefines a symbol
authorAlan Modra <amodra@gmail.com>
Sat, 20 Feb 2021 05:15:44 +0000 (15:45 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 21 Feb 2021 03:58:16 +0000 (14:28 +1030)
Note that we don't even warn if scripts adjust a symbol as in
ld-elf/var1 and ld-scripts/pr14962.

include/
* bfdlink.h (struct bfd_link_info): Add warn_multiple_definition.
ld/
* ldexp.c (exp_fold_tree_1): Warn on script defining a symbol
defined in an object file.
* ldmain.c (multiple_definition): Heed info->warn_multiple_definition.
* testsuite/ld-scripts/defined5.d: Expect a warning.

include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/ldexp.c
ld/ldmain.c
ld/testsuite/ld-scripts/defined5.d

index 71f0beb13b08db004163b3559a837ed2c73c2adb..616b923b53b15efd45ec8aa397e01d8bf0dfef1d 100644 (file)
@@ -1,3 +1,7 @@
+2021-02-21  Alan Modra  <amodra@gmail.com>
+
+       * bfdlink.h (struct bfd_link_info): Add warn_multiple_definition.
+
 2021-02-17  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-api.h (ctf_arc_lookup_symbol_name): New.
index 079e31227ed2dff2ab21500d5ec8dbf90ab30174..95728b6f031ca5b6eb6306fdd497859cc5dad360 100644 (file)
@@ -465,12 +465,16 @@ struct bfd_link_info
      statics.  */
   unsigned int task_link: 1;
 
-  /* TRUE if ok to have multiple definition.  */
+  /* TRUE if ok to have multiple definitions, without warning.  */
   unsigned int allow_multiple_definition: 1;
 
-  /* TRUE if ok to have prohibit multiple definition of absolute symbols.  */
+  /* TRUE if multiple definition of absolute symbols (eg. from -R) should
+     be reported.  */
   unsigned int prohibit_multiple_definition_absolute: 1;
 
+  /* TRUE if multiple definitions should only warn.  */
+  unsigned int warn_multiple_definition: 1;
+
   /* TRUE if ok to have version with no definition.  */
   unsigned int allow_undefined_version: 1;
 
index 9d16c305200ea53f09bc77e6ff9f6dafdce6fb42..2339a4014cdfe932c177f3e1553ac923701e6466 100644 (file)
@@ -1,3 +1,10 @@
+2021-02-21  Alan Modra  <amodra@gmail.com>
+
+       * ldexp.c (exp_fold_tree_1): Warn on script defining a symbol
+       defined in an object file.
+       * ldmain.c (multiple_definition): Heed info->warn_multiple_definition.
+       * testsuite/ld-scripts/defined5.d: Expect a warning.
+
 2021-02-19  Alan Modra  <amodra@gmail.com>
 
        * testsuite/lib/ld-lib.exp: Whitespace.
index 084bb17c4bffb3cc912978dd65a18ba907014c93..016784505b2b0fad4dc511729f1e52537a39417b 100644 (file)
@@ -1186,16 +1186,19 @@ exp_fold_tree_1 (etree_type *tree)
                {
                  if (expld.result.section == NULL)
                    expld.result.section = expld.section;
-                 if (!update_definedness (tree->assign.dst, h) && 0)
+                 if (!update_definedness (tree->assign.dst, h)
+                     && expld.assign_name != NULL)
                    {
-                     /* Symbol was already defined.  For now this error
-                        is disabled because it causes failures in the ld
-                        testsuite: ld-elf/var1, ld-scripts/defined5, and
-                        ld-scripts/pr14962.  Some of these no doubt
-                        reflect scripts used in the wild.  */
+                     /* Symbol was already defined, and the script isn't
+                        modifying the symbol value for some reason as in
+                        ld-elf/var1 and ld-scripts/pr14962.
+                        For now this is only a warning.  */
+                     unsigned int warn = link_info.warn_multiple_definition;
+                     link_info.warn_multiple_definition = 1;
                      (*link_info.callbacks->multiple_definition)
                        (&link_info, h, link_info.output_bfd,
                         expld.result.section, expld.result.value);
+                     link_info.warn_multiple_definition = warn;
                    }
                  if (expld.phase == lang_fixed_phase_enum)
                    {
index 863df0293ea12ffc29deee1cb363bedd947082b3..5c88ee744f81ccd61c20246efd5675f6a2052beb 100644 (file)
@@ -1074,7 +1074,9 @@ multiple_definition (struct bfd_link_info *info,
       nval = oval;
       obfd = NULL;
     }
-  einfo (_("%X%P: %C: multiple definition of `%pT'"),
+  if (!info->warn_multiple_definition)
+    einfo ("%X");
+  einfo (_("%P: %C: multiple definition of `%pT'"),
         nbfd, nsec, nval, name);
   if (obfd != NULL)
     einfo (_("; %D: first defined here"), obfd, osec, oval);
index 2530c0e09eaa22b86455a2ce44800e0539a0e413..7aa680b85ab2488808afd792d345cb384e4b4a3d 100644 (file)
@@ -1,10 +1,11 @@
 #ld: -Tdefined5.t
+#warning: .*multiple definition of `defined'.*
 #nm: -B
-#source: defined5.s
 #xfail: [is_xcoff_format]
 # xcoff outputs value of "defined" from the object file
 
-# Check that arithmetic on DEFINED works.
+# Check that a script can override an object file symbol, if multiple
+# definitions are allowed.  See pr12356.
 #...
 0+1000 D defined
 #pass