COFF: Check for symbols defined in discarded section
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 15 Mar 2019 14:19:01 +0000 (22:19 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 15 Mar 2019 14:19:20 +0000 (22:19 +0800)
For LTO, a symbol may defined in discarded section.  We should mark it
as undefined so that LTO plugin will make IR definition available.

PR ld/24267
* coffgen.c (_bfd_coff_section_already_linked): Skip discarded
section.
* cofflink.c (coff_link_add_symbols): Check for symbols defined
in discarded section.

bfd/ChangeLog
bfd/coffgen.c
bfd/cofflink.c

index b044fad208f903236353aea4df84b11fb404f5b0..b019ca6fa43c4d43e38b18e1d6c8fc96e5baa71f 100644 (file)
@@ -1,3 +1,11 @@
+2019-03-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/24267
+       * coffgen.c (_bfd_coff_section_already_linked): Skip discarded
+       section.
+       * cofflink.c (coff_link_add_symbols): Check for symbols defined
+       in discarded section.
+
 2019-03-15  Alan Modra  <amodra@gmail.com>
 
        PR 24339
index 5db35c7ddf13bdfa9b05883e0aa783c2e53a1e92..ccf4b4302c5dd81f0e732e718dc3ce0b1d18fac9 100644 (file)
@@ -2652,6 +2652,9 @@ _bfd_coff_section_already_linked (bfd *abfd,
   struct bfd_section_already_linked_hash_entry *already_linked_list;
   struct coff_comdat_info *s_comdat;
 
+  if (sec->output_section == bfd_abs_section_ptr)
+    return FALSE;
+
   flags = sec->flags;
   if ((flags & SEC_LINK_ONCE) == 0)
     return FALSE;
index e4031b9a31ea1daf167b249b7af5859145ba49aa..ac07d05e5789812fec774aa6bf8cbe0941c5dfcf 100644 (file)
@@ -310,7 +310,9 @@ coff_link_add_symbols (bfd *abfd,
            case COFF_SYMBOL_GLOBAL:
              flags = BSF_EXPORT | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
-             if (! obj_pe (abfd))
+             if (discarded_section (section))
+               section = bfd_und_section_ptr;
+             else if (! obj_pe (abfd))
                value -= section->vma;
              break;
 
@@ -327,6 +329,8 @@ coff_link_add_symbols (bfd *abfd,
            case COFF_SYMBOL_PE_SECTION:
              flags = BSF_SECTION_SYM | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
+             if (discarded_section (section))
+               section = bfd_und_section_ptr;
              break;
            }
 
This page took 0.029589 seconds and 4 git commands to generate.