From def97fb945a98544938087eff3111e16ce58da6d Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 28 Jan 2021 10:30:36 +1030 Subject: 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. --- ld/ChangeLog | 6 ++++++ ld/ldelf.c | 21 ++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index df20606..9dfff4a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2021-01-28 Alan Modra + + PR 27259 + * ldelf.c (ldelf_before_place_orphans): Use linker_mark to + prevent endless looping of linked-to sections. + 2021-01-26 H.J. Lu * testsuite/ld-x86-64/bnd-plt-1.d: Fix a typo. diff --git a/ld/ldelf.c b/ld/ldelf.c index 9887e53..0499925 100644 --- a/ld/ldelf.c +++ b/ld/ldelf.c @@ -2188,14 +2188,21 @@ ldelf_before_place_orphans (void) been discarded. */ asection *linked_to_sec; for (linked_to_sec = elf_linked_to_section (isec); - linked_to_sec != NULL; + linked_to_sec != NULL && !linked_to_sec->linker_mark; linked_to_sec = elf_linked_to_section (linked_to_sec)) - if (discarded_section (linked_to_sec)) - { - isec->output_section = bfd_abs_section_ptr; - isec->flags |= SEC_EXCLUDE; - break; - } + { + if (discarded_section (linked_to_sec)) + { + isec->output_section = bfd_abs_section_ptr; + isec->flags |= SEC_EXCLUDE; + 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; } } } -- cgit v1.1