diff options
author | Alan Modra <amodra@gmail.com> | 2021-01-28 10:30:36 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-01-28 18:53:30 +1030 |
commit | def97fb945a98544938087eff3111e16ce58da6d (patch) | |
tree | 7efaf17089a481046698eabc075a1fb6cfe0b874 /ld/ldelf.c | |
parent | 2f985dd1acf41d6b52ee2433f09a5fcc0244456a (diff) | |
download | gdb-def97fb945a98544938087eff3111e16ce58da6d.zip gdb-def97fb945a98544938087eff3111e16ce58da6d.tar.gz gdb-def97fb945a98544938087eff3111e16ce58da6d.tar.bz2 |
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.
Diffstat (limited to 'ld/ldelf.c')
-rw-r--r-- | ld/ldelf.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -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; } } } |