]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
multiple definition warnings from script symbols
authorAlan Modra <amodra@gmail.com>
Fri, 7 May 2021 01:54:10 +0000 (11:24 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 7 May 2021 06:55:40 +0000 (16:25 +0930)
In commit 89753bbf81 I enabled a warning for scripts redefining
symbols.  The idea was to not warn for symbols defined by shared
libraries (the h->u.def.section->output_section != NULL test), but the
test failed to take into account absolute symbols.  Absolute symbols
defined in shared libraries are currently indistinguishable from
absolute symbols defined in relocatable objects, at least when only
looking at struct bfd_link_hash_entry.  So, don't warn for any
absolute symbols.

* ldexp.c (update_definedness): Don't return false for absolute
symbols.
* ldmain.c (multiple_definition): Print "warning: " in message
when not a hard error.

ld/ChangeLog
ld/ldexp.c
ld/ldmain.c

index 80247c536822adb568f485151587b6cdb3317048..fa367d3e69c582233c116d0be75a865dee55cb1e 100644 (file)
@@ -1,3 +1,10 @@
+2021-05-07  Alan Modra  <amodra@gmail.com>
+
+       * ldexp.c (update_definedness): Don't return false for absolute
+       symbols.
+       * ldmain.c (multiple_definition): Print "warning: " in message
+       when not a hard error.
+
 2021-05-07  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-elf/pr27825-1.d: Correct xfail.
index 2efbec658be07dad40f112d14418591c8a0c0c3d..02c76f8b33c22dd6235aec8ef49aac68d299267f 100644 (file)
@@ -325,6 +325,7 @@ update_definedness (const char *name, struct bfd_link_hash_entry *h)
       defentry->by_object = 1;
       if (h->type == bfd_link_hash_defined
          && h->u.def.section->output_section != NULL
+         && !bfd_is_abs_section (h->u.def.section)
          && !h->linker_def)
        ret = false;
     }
index be33b6943c671f301b4cc8f1aedccbf2311658cf..42660eb9a3ce309b9ee98b27ebcea0d392dfef67 100644 (file)
@@ -1073,10 +1073,12 @@ multiple_definition (struct bfd_link_info *info,
       nval = oval;
       obfd = NULL;
     }
-  if (!info->warn_multiple_definition)
-    einfo ("%X");
-  einfo (_("%P: %C: multiple definition of `%pT'"),
-        nbfd, nsec, nval, name);
+  if (info->warn_multiple_definition)
+    einfo (_("%P: %C: warning: multiple definition of `%pT'"),
+          nbfd, nsec, nval, name);
+  else
+    einfo (_("%X%P: %C: multiple definition of `%pT'"),
+          nbfd, nsec, nval, name);
   if (obfd != NULL)
     einfo (_("; %D: first defined here"), obfd, osec, oval);
   einfo ("\n");