forked from Imagelibrary/binutils-gdb
Mark the plugin symbol undefined
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. bfd/ PR ld/12365 PR ld/14272 * elflink.c (_bfd_elf_fix_symbol_flags): Mark the plugin symbol undefined if it is referenced from a non-IR file. ld/testsuite/ PR ld/12365 * ld-plugin/pr12365a.c: New file. * ld-plugin/pr12365b.c: Likewise. * ld-plugin/pr12365c.c: Likewise. * ld-plugin/lto.exp (lto_link_tests): Prepare for the PR ld/12365 test. Run the PR ld/12365 test.
This commit is contained in:
@@ -2423,6 +2423,20 @@ _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, except for symbol for linker
|
||||
created section. */
|
||||
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->flags & SEC_LINKER_CREATED) == 0
|
||||
&& 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
|
||||
|
||||
Reference in New Issue
Block a user