aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfn32-mips.c
diff options
context:
space:
mode:
authorDjordje Todorovic <djordje.todorovic@rt-rk.com>2017-11-08 21:19:05 +0000
committerMaciej W. Rozycki <macro@mips.com>2017-11-08 21:19:05 +0000
commit9031cb4af0adcf1c73cb9b8c73ca2d989023af2f (patch)
tree7d145eb97da4e384a0af6bcd8efc075d4ba433ae /bfd/elfn32-mips.c
parent2f4732b0e622d9d5d899c29e2132e4cd2966aaad (diff)
downloadgdb-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/elfn32-mips.c')
-rw-r--r--bfd/elfn32-mips.c44
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"