[PATCH] COFF: Check for symbols defined in discarded section
H.J. Lu
hjl.tools@gmail.com
Fri Mar 15 13:02:00 GMT 2019
For LTO, a symbol may be defined in discarded section. We should mark
such symbol as undefined so that LTO plugin will make IR definition
available.
Verified with the original failed case.
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/coffgen.c | 3 +++
bfd/cofflink.c | 6 +++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index 5db35c7ddf..ccf4b4302c 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -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;
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index e4031b9a31..ac07d05e57 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -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;
}
--
2.20.1
More information about the Binutils
mailing list