PR24567, assertion failure in ldlang.c:6868 when compiling with -flto
As the existing comment said: "a common ought to be overridden by a def in a -flto object". This patch makes the code actually do that, rather than allowing a normal object file common to override a -flto defined symbol. PR 24567 * plugin.c (plugin_notice): Do not let a common symbol override a non-common definition in IR.
This commit is contained in:
parent
2664858829
commit
af4fa23fba
2 changed files with 30 additions and 18 deletions
42
ld/plugin.c
42
ld/plugin.c
|
@ -1406,30 +1406,36 @@ plugin_notice (struct bfd_link_info *info,
|
|||
ref = TRUE;
|
||||
}
|
||||
|
||||
/* Otherwise, it must be a new def. */
|
||||
else
|
||||
|
||||
/* A common symbol should be merged with other commons or
|
||||
defs with the same name. In particular, a common ought
|
||||
to be overridden by a def in a -flto object. In that
|
||||
sense a common is also a ref. */
|
||||
else if (bfd_is_com_section (section))
|
||||
{
|
||||
/* Ensure any symbol defined in an IR dummy BFD takes on a
|
||||
new value from a real BFD. Weak symbols are not normally
|
||||
overridden by a new weak definition, and strong symbols
|
||||
will normally cause multiple definition errors. Avoid
|
||||
this by making the symbol appear to be undefined. */
|
||||
if (((h->type == bfd_link_hash_defweak
|
||||
|| h->type == bfd_link_hash_defined)
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
|
||||
|| (h->type == bfd_link_hash_common
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
|
||||
if (h->type == bfd_link_hash_common
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner))
|
||||
{
|
||||
h->type = bfd_link_hash_undefweak;
|
||||
h->u.undef.abfd = sym_bfd;
|
||||
}
|
||||
ref = TRUE;
|
||||
}
|
||||
|
||||
/* A common symbol should be merged with other commons or
|
||||
defs with the same name. In particular, a common ought
|
||||
to be overridden by a def in a -flto object. In that
|
||||
sense a common is also a ref. */
|
||||
if (bfd_is_com_section (section))
|
||||
ref = TRUE;
|
||||
/* Otherwise, it must be a new def.
|
||||
Ensure any symbol defined in an IR dummy BFD takes on a
|
||||
new value from a real BFD. Weak symbols are not normally
|
||||
overridden by a new weak definition, and strong symbols
|
||||
will normally cause multiple definition errors. Avoid
|
||||
this by making the symbol appear to be undefined. */
|
||||
else if (((h->type == bfd_link_hash_defweak
|
||||
|| h->type == bfd_link_hash_defined)
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
|
||||
|| (h->type == bfd_link_hash_common
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
|
||||
{
|
||||
h->type = bfd_link_hash_undefweak;
|
||||
h->u.undef.abfd = sym_bfd;
|
||||
}
|
||||
|
||||
if (ref)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue