Debug info is lost for functions only called from functions marked with cmse_nonsecur...
authorNick Clifton <nickc@redhat.com>
Fri, 5 May 2023 10:11:32 +0000 (11:11 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 5 May 2023 10:11:32 +0000 (11:11 +0100)
  PR 30354
  * elf32-arm.c (elf32_arm_gc_mark_extra_sections): If any debug sections are marked then rerun the extra marking in order to pick up any dependencies.

bfd/ChangeLog
bfd/elf32-arm.c

index 013386d60079187365f0b49b69c1d7d056620dfd..b8150d4d0c8edf28abb2ea0a1d5dd965cd526ccd 100644 (file)
@@ -1,3 +1,10 @@
+2023-05-05  Nick Clifton  <nickc@redhat.com>
+
+       PR 30354
+       * elf32-arm.c (elf32_arm_gc_mark_extra_sections): If any debug
+       sections are marked then rerun the extra marking in order to pick
+       up any dependencies.
+
 2023-05-03  Oleg Tolmatcev  <oleg.tolmatcev@gmail.com>
 
        * archive.c (_bfd_write_archive_contents): Use a larger buffer in
index 70413668e5a5ec3d451eca075329b39a8d8d9a7f..cb22989f6f1fb14721676ef8a99bc62aaa6a6fb5 100644 (file)
@@ -15937,7 +15937,7 @@ elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
   struct elf_link_hash_entry **sym_hashes;
   struct elf32_arm_link_hash_entry *cmse_hash;
   bool again, is_v8m, first_bfd_browse = true;
-  bool debug_sec_need_to_be_marked = false;
+  bool extra_marks_added = false;
   asection *isec;
 
   _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
@@ -15981,6 +15981,8 @@ elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
             of them so no need for a second browsing.  */
          if (is_v8m && first_bfd_browse)
            {
+             bool debug_sec_need_to_be_marked = false;
+
              sym_hashes = elf_sym_hashes (sub);
              bed = get_elf_backend_data (sub);
              symtab_hdr = &elf_tdata (sub)->symtab_hdr;
@@ -15997,7 +15999,7 @@ elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
                  /* Assume it is a special symbol.  If not, cmse_scan will
                     warn about it and user can do something about it.  */
                  if (startswith (cmse_hash->root.root.root.string,
-                                   CMSE_PREFIX))
+                                 CMSE_PREFIX))
                    {
                      cmse_sec = cmse_hash->root.root.u.def.section;
                      if (!cmse_sec->gc_mark
@@ -16018,15 +16020,24 @@ elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
                    {
                      /* If not a debug sections, skip it.  */
                      if (!isec->gc_mark && (isec->flags & SEC_DEBUGGING))
-                       isec->gc_mark = 1 ;
+                       {
+                         isec->gc_mark = 1;
+                         extra_marks_added = true;
+                       }
                    }
                  debug_sec_need_to_be_marked = false;
                }
            }
        }
+
       first_bfd_browse = false;
     }
 
+  /* PR 30354: If we have added extra marks then make sure that any
+     dependencies of the newly marked sections are also marked.  */
+  if (extra_marks_added)
+    _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
+
   return true;
 }