gdb/corefile: write NT_GDB_TDESC based on signalled thread
When creating a core file from within GDB we include a NT_GDB_TDESC that includes the target description of the architecture in use. For architectures with dynamic architectures (e.g. AArch64 with sve/sme) the original architecture, calculated from the original target description, might not match the per-thread architecture. In the general case, where each thread has a different architecture, then we really need a separate NT_GDB_TDESC for each thread, however, there's currently no way to read in multiple NT_GDB_TDESC. This commit is a step towards per-thread NT_GDB_TDESC. In this commit I have updated the function that writes the NT_GDB_TDESC to accept a gdbarch (rather than calling target_gdbarch() to find a gdbarch), and I now pass in the gdbarch of the signalled thread. In many cases (though NOT all) targets with dynamic architectures really only use a single architecture, even when there are multiple threads, so in the common case, this should ensure that GDB emits an architecture that is more likely to be correct. Additional work will be needed in order to support corefiles with truly per-thread architectures, but that will need to be done in the future.
This commit is contained in:
parent
1c9b44fe07
commit
c14993e9dc
5 changed files with 23 additions and 10 deletions
|
@ -110,8 +110,12 @@ elf_none_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd,
|
|||
}
|
||||
|
||||
|
||||
/* Target description. */
|
||||
gcore_elf_make_tdesc_note (obfd, ¬e_data, note_size);
|
||||
/* Include the target description when possible. Some architectures
|
||||
allow for per-thread gdbarch so we should really be emitting a tdesc
|
||||
per-thread, however, we don't currently support reading in a
|
||||
per-thread tdesc, so just emit the tdesc for the signalled thread. */
|
||||
gdbarch = target_thread_architecture (signalled_thr->ptid);
|
||||
gcore_elf_make_tdesc_note (gdbarch, obfd, ¬e_data, note_size);
|
||||
|
||||
return note_data;
|
||||
}
|
||||
|
|
|
@ -773,8 +773,12 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Include the target description when possible. */
|
||||
gcore_elf_make_tdesc_note (obfd, ¬e_data, note_size);
|
||||
/* Include the target description when possible. Some architectures
|
||||
allow for per-thread gdbarch so we should really be emitting a tdesc
|
||||
per-thread, however, we don't currently support reading in a
|
||||
per-thread tdesc, so just emit the tdesc for the signalled thread. */
|
||||
gdbarch = target_thread_architecture (signalled_thr->ptid);
|
||||
gcore_elf_make_tdesc_note (gdbarch, obfd, ¬e_data, note_size);
|
||||
|
||||
return note_data;
|
||||
}
|
||||
|
|
|
@ -139,12 +139,12 @@ gcore_elf_build_thread_register_notes
|
|||
/* See gcore-elf.h. */
|
||||
|
||||
void
|
||||
gcore_elf_make_tdesc_note (bfd *obfd,
|
||||
gcore_elf_make_tdesc_note (struct gdbarch *gdbarch, bfd *obfd,
|
||||
gdb::unique_xmalloc_ptr<char> *note_data,
|
||||
int *note_size)
|
||||
{
|
||||
/* Append the target description to the core file. */
|
||||
const struct target_desc *tdesc = gdbarch_target_desc (target_gdbarch ());
|
||||
const struct target_desc *tdesc = gdbarch_target_desc (gdbarch);
|
||||
const char *tdesc_xml
|
||||
= tdesc == nullptr ? nullptr : tdesc_get_features_xml (tdesc);
|
||||
if (tdesc_xml != nullptr && *tdesc_xml != '\0')
|
||||
|
|
|
@ -37,11 +37,12 @@ extern void gcore_elf_build_thread_register_notes
|
|||
bfd *obfd, gdb::unique_xmalloc_ptr<char> *note_data, int *note_size);
|
||||
|
||||
/* Add content to *NOTE_DATA (and update *NOTE_SIZE) to include a note
|
||||
containing the current target's target description. The core file is
|
||||
containing the target description for GDBARCH. The core file is
|
||||
being written to OBFD. If something goes wrong then *NOTE_DATA can be
|
||||
set to nullptr. */
|
||||
|
||||
extern void gcore_elf_make_tdesc_note
|
||||
(bfd *obfd, gdb::unique_xmalloc_ptr<char> *note_data, int *note_size);
|
||||
(struct gdbarch *gdbarch, bfd *obfd,
|
||||
gdb::unique_xmalloc_ptr<char> *note_data, int *note_size);
|
||||
|
||||
#endif /* GCORE_ELF_H */
|
||||
|
|
|
@ -2128,8 +2128,12 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
|
|||
/* File mappings. */
|
||||
linux_make_mappings_corefile_notes (gdbarch, obfd, note_data, note_size);
|
||||
|
||||
/* Target description. */
|
||||
gcore_elf_make_tdesc_note (obfd, ¬e_data, note_size);
|
||||
/* Include the target description when possible. Some architectures
|
||||
allow for per-thread gdbarch so we should really be emitting a tdesc
|
||||
per-thread, however, we don't currently support reading in a
|
||||
per-thread tdesc, so just emit the tdesc for the signalled thread. */
|
||||
gdbarch = target_thread_architecture (signalled_thr->ptid);
|
||||
gcore_elf_make_tdesc_note (gdbarch, obfd, ¬e_data, note_size);
|
||||
|
||||
return note_data;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue