PR27259, SHF_LINK_ORDER self-link

This stops ld from endless looping on SHF_LINK_ORDER sh_link loops.

bfd/
	PR 27259
	* elflink.c (_bfd_elf_gc_mark_extra_sections): Use linker_mark to
	prevent endless looping of linked-to sections.
ld/
	PR 27259
	* ldelf.c (ldelf_before_place_orphans): Use linker_mark to
	prevent endless looping of linked-to sections.
This commit is contained in:
Alan Modra 2021-01-28 10:30:36 +10:30
parent 2f985dd1ac
commit def97fb945
4 changed files with 42 additions and 15 deletions

View file

@ -13631,15 +13631,23 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info,
/* Since all sections, except for backend specific ones,
have been garbage collected, call mark_hook on this
section if any of its linked-to sections is marked. */
asection *linked_to_sec = elf_linked_to_section (isec);
for (; linked_to_sec != NULL;
asection *linked_to_sec;
for (linked_to_sec = elf_linked_to_section (isec);
linked_to_sec != NULL && !linked_to_sec->linker_mark;
linked_to_sec = elf_linked_to_section (linked_to_sec))
if (linked_to_sec->gc_mark)
{
if (!_bfd_elf_gc_mark (info, isec, mark_hook))
return FALSE;
break;
}
{
if (linked_to_sec->gc_mark)
{
if (!_bfd_elf_gc_mark (info, isec, mark_hook))
return FALSE;
break;
}
linked_to_sec->linker_mark = 1;
}
for (linked_to_sec = elf_linked_to_section (isec);
linked_to_sec != NULL && linked_to_sec->linker_mark;
linked_to_sec = elf_linked_to_section (linked_to_sec))
linked_to_sec->linker_mark = 0;
}
if (!debug_frag_seen