This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR ld/14272: Mark the plugin symbol undefined
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Thu, 28 Jun 2012 15:10:26 -0700
- Subject: PATCH: PR ld/14272: Mark the plugin symbol undefined
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
LTO may optimize out a plugin symbol, which is also referenced by a
non-IR file. When that happens, we should mark the plugin symbol
undefined. It isn't the problem since LTO already determined the
symbols in the non-IR file aren't used. OK to install?
Thanks.
H.J.
---
2012-06-28 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14272
* elflink.c (_bfd_elf_fix_symbol_flags): Mark the plugin symbol
undefined if it is referenced from a non-IR file.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 8fb2ae3..4a0f858 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -2451,6 +2451,18 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
}
else
{
+ /* If a plugin symbol is referenced from a non-IR file, mark
+ the symbol as undefined. */
+ if (h->root.non_ir_ref
+ && (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h->root.u.def.section->owner != NULL
+ && (h->root.u.def.section->owner->flags & BFD_PLUGIN) != 0)
+ {
+ h->root.type = bfd_link_hash_undefined;
+ h->root.u.undef.abfd = h->root.u.def.section->owner;
+ }
+
/* Unfortunately, NON_ELF is only correct if the symbol
was first seen in a non-ELF file. Fortunately, if the symbol
was first seen in an ELF file, we're probably OK unless the