diff options
author | Djordje Todorovic <djordje.todorovic@rt-rk.com> | 2017-11-08 21:19:05 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@mips.com> | 2017-11-08 21:19:05 +0000 |
commit | 9031cb4af0adcf1c73cb9b8c73ca2d989023af2f (patch) | |
tree | 7d145eb97da4e384a0af6bcd8efc075d4ba433ae /bfd/elf32-mips.c | |
parent | 2f4732b0e622d9d5d899c29e2132e4cd2966aaad (diff) | |
download | gdb-9031cb4af0adcf1c73cb9b8c73ca2d989023af2f.zip gdb-9031cb4af0adcf1c73cb9b8c73ca2d989023af2f.tar.gz gdb-9031cb4af0adcf1c73cb9b8c73ca2d989023af2f.tar.bz2 |
BFD: Write Linux core PRSTATUS note into MIPS core file
On MIPS o32, n32 and n64 platforms information such as PID was not
correctly written into core file from GDB.
This fixes that behavior.
bfd/ChangeLog:
* elf32-mips.c (elf32_mips_write_core_note): New function.
(elf_backend_write_core_note): New macro.
* elf64-mips.c (elf64_mips_write_core_note): New function.
(elf_backend_write_core_note): New macro.
* elfn32-mips.c (elf32_mips_write_core_note): New function.
(elf_backend_write_core_note): New macro.
Diffstat (limited to 'bfd/elf32-mips.c')
-rw-r--r-- | bfd/elf32-mips.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 17ca432..3b48103 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -2373,6 +2373,45 @@ elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +/* 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[256]; + 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, 180); + memset (data + 252, 0, 4); + 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. */ @@ -2554,6 +2593,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" @@ -2575,6 +2617,8 @@ 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" /* Implement elf_backend_final_write_processing for VxWorks. */ |