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/elf64-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/elf64-mips.c')
-rw-r--r-- | bfd/elf64-mips.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index d51124b..af0c01c 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -4248,6 +4248,45 @@ elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +/* Write Linux core PRSTATUS note into core file. */ + +static char * +elf64_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[480]; + va_list ap; + long pid; + int cursig; + const void *greg; + + va_start (ap, note_type); + memset (data, 0, 112); + pid = va_arg (ap, long); + bfd_put_32 (abfd, pid, data + 32); + cursig = va_arg (ap, int); + bfd_put_16 (abfd, cursig, data + 12); + greg = va_arg (ap, const void *); + memcpy (data + 112, greg, 360); + memset (data + 472, 0, 8); + va_end (ap); + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", note_type, data, sizeof (data)); + } + } +} /* ECOFF swapping routines. These are used when dealing with the .mdebug section, which is in the ECOFF debugging format. */ @@ -4454,6 +4493,9 @@ const struct elf_size_info mips_elf64_size_info = #define ELF_COMMONPAGESIZE 0x1000 #define elf64_bed elf64_tradbed +#undef elf_backend_write_core_note +#define elf_backend_write_core_note elf64_mips_write_core_note + /* Include the target file again for this target. */ #include "elf64-target.h" @@ -4476,4 +4518,6 @@ const struct elf_size_info mips_elf64_size_info = #undef elf64_bed #define elf64_bed elf64_fbsd_tradbed +#undef elf64_mips_write_core_note + #include "elf64-target.h" |