diff options
Diffstat (limited to 'bfd/elfn32-mips.c')
-rw-r--r-- | bfd/elfn32-mips.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 9ac2da3..8e5efa5 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -3632,6 +3632,45 @@ elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) return _bfd_elfcore_make_pseudosection (abfd, ".reg", size, note->descpos + offset); } + +/* Write Linux core PRSTATUS note into core file. */ + +static char * +elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, + ...) +{ + switch (note_type) + { + default: + return NULL; + + case NT_PRPSINFO: + BFD_FAIL (); + return NULL; + + case NT_PRSTATUS: + { + char data[440]; + va_list ap; + long pid; + int cursig; + const void *greg; + + va_start (ap, note_type); + memset (data, 0, 72); + pid = va_arg (ap, long); + bfd_put_32 (abfd, pid, data + 24); + cursig = va_arg (ap, int); + bfd_put_16 (abfd, cursig, data + 12); + greg = va_arg (ap, const void *); + memcpy (data + 72, greg, 360); + memset (data + 432, 0, 8); + va_end (ap); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", note_type, data, sizeof (data)); + } + } +} /* Depending on the target vector we generate some version of Irix executables or "normal" MIPS ELF ABI executables. */ @@ -3824,6 +3863,9 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define ELF_COMMONPAGESIZE 0x1000 #define elf32_bed elf32_tradbed +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf32_mips_write_core_note + /* Include the target file again for this target. */ #include "elf32-target.h" @@ -3846,4 +3888,6 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #undef elf32_bed #define elf32_bed elf32_fbsd_tradbed +#undef elf_backend_write_core_note + #include "elf32-target.h" |