]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR27259, SHF_LINK_ORDER self-link
authorAlan Modra <amodra@gmail.com>
Thu, 28 Jan 2021 00:00:36 +0000 (10:30 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 29 Jan 2021 22:45:18 +0000 (09:15 +1030)
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.

(cherry picked from commit def97fb945a98544938087eff3111e16ce58da6d)

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/ldelf.c

index 2350c2f20f8767b8585d8bdfe18f7d8c96b565a5..ceea15e4294b42a9b9ff388b1f868ea7ebb39ab0 100644 (file)
@@ -1,3 +1,11 @@
+2021-01-30  Alan Modra  <amodra@gmail.com>
+
+       Apply from master
+       2021-01-28  Alan Modra  <amodra@gmail.com>
+       PR 27259
+       * elflink.c (_bfd_elf_gc_mark_extra_sections): Use linker_mark to
+       prevent endless looping of linked-to sections.
+
 2021-01-28  Alan Modra  <amodra@gmail.com>
 
        Apply from master
index 222a4573b00f11419dc5f52fa29ff871220f3c7d..28efeb91814f5f76b732a5e1da212aeaead7752a 100644 (file)
@@ -13499,15 +13499,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
index e9374b463355e12f1294f4f535cce209dbef87fb..92275d7224068dcf3ccd61d58aedf722b8adbc84 100644 (file)
@@ -1,6 +1,11 @@
 2021-01-30  Alan Modra  <amodra@gmail.com>
 
        Apply from master
+       2021-01-28  Alan Modra  <amodra@gmail.com>
+       PR 27259
+       * ldelf.c (ldelf_before_place_orphans): Use linker_mark to
+       prevent endless looping of linked-to sections.
+
        2020-07-29  Alan Modra  <amodra@gmail.com>
        * ldelf.c (ldelf_before_place_orphans): Set SEC_EXCLUDE for
        discarded sections.
index bcac331ff56d808390f2b86bc546cdcf1e5e95d0..d5ddbeb0e839e1517319009c631d8256e854bf46 100644 (file)
@@ -2187,14 +2187,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;
          }
       }
 }