mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
Generate NT_PROCSTAT_{AUXV,VMMAP,PS_STRINGS} in FreeBSD coredumps
gcore generates NT_AUXV and NT_FILE notes for Linux targets. On FreeBSD auxv is stored in a NT_PROCSTAT_AUXV section, virtual memory mappings are stored in a NT_PROCSTAT_VMMAP, and both are prefixed with the struct size. In addition, store a NT_PROCSTAT_PS_STRINGS note saving the initial location of the argv[] and environment[] arrays. gdb/ChangeLog: PR gdb/23105 * fbsd-nat.c (fbsd_nat_target::xfer_partial): Add support for TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS. * fbsd-tdep.c (fbsd_make_note_desc): New. (fbsd_make_corefile_notes): Write NT_PROCSTAT_AUXV, NT_PROCSTAT_VMMAP and NT_PROCSTAT_PS_STRINGS notes. * target.h (enum target_object) Add FreeBSD-specific TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS.
This commit is contained in:
@ -512,6 +512,28 @@ fbsd_corefile_thread (struct thread_info *info,
|
||||
args->note_size, args->stop_signal);
|
||||
}
|
||||
|
||||
/* Return a byte_vector containing the contents of a core dump note
|
||||
for the target object of type OBJECT. If STRUCTSIZE is non-zero,
|
||||
the data is prefixed with a 32-bit integer size to match the format
|
||||
used in FreeBSD NT_PROCSTAT_* notes. */
|
||||
|
||||
static gdb::optional<gdb::byte_vector>
|
||||
fbsd_make_note_desc (enum target_object object, uint32_t structsize)
|
||||
{
|
||||
gdb::optional<gdb::byte_vector> buf =
|
||||
target_read_alloc (current_top_target (), object, NULL);
|
||||
if (!buf || buf->empty ())
|
||||
return {};
|
||||
|
||||
if (structsize == 0)
|
||||
return buf;
|
||||
|
||||
gdb::byte_vector desc (sizeof (structsize) + buf->size ());
|
||||
memcpy (desc.data (), &structsize, sizeof (structsize));
|
||||
memcpy (desc.data () + sizeof (structsize), buf->data (), buf->size ());
|
||||
return desc;
|
||||
}
|
||||
|
||||
/* Create appropriate note sections for a corefile, returning them in
|
||||
allocated memory. */
|
||||
|
||||
@ -586,6 +608,40 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
|
||||
|
||||
note_data = thread_args.note_data;
|
||||
|
||||
/* Auxiliary vector. */
|
||||
uint32_t structsize = gdbarch_ptr_bit (gdbarch) / 4; /* Elf_Auxinfo */
|
||||
gdb::optional<gdb::byte_vector> note_desc =
|
||||
fbsd_make_note_desc (TARGET_OBJECT_AUXV, structsize);
|
||||
if (note_desc && !note_desc->empty ())
|
||||
{
|
||||
note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
|
||||
NT_FREEBSD_PROCSTAT_AUXV,
|
||||
note_desc->data (), note_desc->size ());
|
||||
if (!note_data)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Virtual memory mappings. */
|
||||
note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_VMMAP, 0);
|
||||
if (note_desc && !note_desc->empty ())
|
||||
{
|
||||
note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
|
||||
NT_FREEBSD_PROCSTAT_VMMAP,
|
||||
note_desc->data (), note_desc->size ());
|
||||
if (!note_data)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_PS_STRINGS, 0);
|
||||
if (note_desc && !note_desc->empty ())
|
||||
{
|
||||
note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
|
||||
NT_FREEBSD_PROCSTAT_PSSTRINGS,
|
||||
note_desc->data (), note_desc->size ());
|
||||
if (!note_data)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return note_data;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user