+2020-06-15  Alan Modra  <amodra@gmail.com>
+
+       PR 26103
+       * elflink.c (elf_link_add_archive_symbols): Exclude undefined
+       symbols that were defined in discarded sections.
+       * cofflink.c (coff_link_check_archive_element): Likewise.
+       (coff_link_add_symbols): Set indx to -3 for symbols defined in
+       discarded sections.
+       (_bfd_coff_write_global_sym): Don't emit such symbols.
+       libcoff-in.h (struct coff_link_hash_entry): Update indx comment.
+       libcoff.h: Regenerate.
+
 2020-06-11  Alan Modra  <amodra@gmail.com>
 
        PR 26107
 
   if (h->type != bfd_link_hash_undefined)
     return TRUE;
 
+  /* If the archive element has already been loaded then one
+     of the symbols defined by that element might have been
+     made undefined due to being in a discarded section.  */
+  if (((struct coff_link_hash_entry *) h)->indx == -3)
+    return TRUE;
+
   /* PR 22369 - Skip non COFF objects in the archive.  */
   if (! bfd_family_coff (abfd))
     return TRUE;
          asection *section;
          bfd_vma value;
          bfd_boolean addit;
+         bfd_boolean discarded = FALSE;
 
          /* This symbol is externally visible.  */
 
              flags = BSF_EXPORT | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
              if (discarded_section (section))
-               section = bfd_und_section_ptr;
+               {
+                 discarded = TRUE;
+                 section = bfd_und_section_ptr;
+               }
              else if (! obj_pe (abfd))
                value -= section->vma;
              break;
                      (const char *) NULL, copy, FALSE,
                      (struct bfd_link_hash_entry **) sym_hash)))
                goto error_return;
+
+             if (discarded)
+               (*sym_hash)->indx = -3;
            }
 
          if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
       return FALSE;
 
     case bfd_link_hash_undefined:
+      if (h->indx == -3)
+       return TRUE;
+      /* Fall through.  */
     case bfd_link_hash_undefweak:
       isym.n_scnum = N_UNDEF;
       isym.n_value = 0;
 
          if (h == NULL)
            continue;
 
-         if (h->root.type == bfd_link_hash_common)
+         if (h->root.type == bfd_link_hash_undefined)
+           {
+             /* If the archive element has already been loaded then one
+                of the symbols defined by that element might have been
+                made undefined due to being in a discarded section.  */
+             if (h->indx == -3)
+               continue;
+           }
+         else if (h->root.type == bfd_link_hash_common)
            {
              /* We currently have a common symbol.  The archive map contains
                 a reference to this symbol, so we may want to include it.  We
              if (! elf_link_is_defined_archive_symbol (abfd, symdef))
                continue;
            }
-         else if (h->root.type != bfd_link_hash_undefined)
+         else
            {
              if (h->root.type != bfd_link_hash_undefweak)
                /* Symbol must be defined.  Don't check it again.  */
 
 {
   struct bfd_link_hash_entry root;
 
-  /* Symbol index in output file.  Set to -1 initially.  Set to -2 if
-     there is a reloc against this symbol.  */
+  /* Symbol index in output file.  This is initialized to -1.  It is
+     set to -2 if the symbol is used by a reloc.  It is set to -3 if
+     this symbol is defined in a discarded section.  */
   long indx;
 
   /* Symbol type.  */
 
 {
   struct bfd_link_hash_entry root;
 
-  /* Symbol index in output file.  Set to -1 initially.  Set to -2 if
-     there is a reloc against this symbol.  */
+  /* Symbol index in output file.  This is initialized to -1.  It is
+     set to -2 if the symbol is used by a reloc.  It is set to -3 if
+     this symbol is defined in a discarded section.  */
   long indx;
 
   /* Symbol type.  */