summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2023-05-05 11:11:32 +0100
committerNick Clifton <nickc@redhat.com>2023-05-05 11:11:32 +0100
commite4fbcd83c2423221ddde99d50b432df7dda06f5f (patch)
tree568c4c39c1871246c47b921848aaa27d702438c6 /bfd
parent6c8a5ab90b0a6d2bb68ab3889ae363cbc9901791 (diff)
downloadbinutils-gdb-e4fbcd83c2423221ddde99d50b432df7dda06f5f.tar.gz
Debug info is lost for functions only called from functions marked with cmse_nonsecure_entr
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf32-arm.c17
2 files changed, 21 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 013386d6007..b8150d4d0c8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 70413668e5a..cb22989f6f1 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -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;
}