Add support for reading Aarch64 core dumps.
authorOmair Javaid <omair.javaid@linaro.org>
Fri, 13 Jun 2014 16:07:21 +0000 (17:07 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 13 Jun 2014 16:07:21 +0000 (17:07 +0100)
* elfxx-aarch64.c (stdarg.h): Include.
(string.h): Include.
(_bfd_aarch64_elf_grok_prstatus): Updated.
(_bfd_aarch64_elf_grok_psinfo): New function.
(_bfd_aarch64_elf_write_core_note): New function.
* elfxx-aarch64.h (elf_backend_grok_psinfo): Define.
(elf_backend_write_core_note): Define.

bfd/ChangeLog
bfd/elfxx-aarch64.c
bfd/elfxx-aarch64.h

index 0caff71a83c490280a2c9d6d04ef149a17b4d8f5..a0402ada9f3f66c6b092c4a01896efe7eb127f80 100644 (file)
@@ -1,3 +1,13 @@
+2014-06-13  Omair Javaid  <omair.javaid@linaro.org>
+
+       * elfxx-aarch64.c (stdarg.h): Include.
+       (string.h): Include.
+       (_bfd_aarch64_elf_grok_prstatus): Updated.
+       (_bfd_aarch64_elf_grok_psinfo): New function.
+       (_bfd_aarch64_elf_write_core_note): New function.
+       * elfxx-aarch64.h (elf_backend_grok_psinfo): Define.
+       (elf_backend_write_core_note): Define.
+
 2014-06-13  Alan Modra  <amodra@gmail.com>
 
        * archive.c: Include bfdlink.h.
index 7db62954e149487f9e84a20f930d32689841d856..b30e730a47cbff42bbc791eace3cbf08bab11d53 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "sysdep.h"
 #include "elfxx-aarch64.h"
+#include <stdarg.h>
+#include <string.h>
 
 #define MASK(n) ((1u << (n)) - 1)
 
@@ -520,3 +522,82 @@ _bfd_aarch64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
                                          size, note->descpos + offset);
 }
+
+bfd_boolean
+_bfd_aarch64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
+{
+  switch (note->descsz)
+    {
+    default:
+      return FALSE;
+
+    case 136:        /* This is sizeof(struct elf_prpsinfo) on Linux/aarch64.  */
+      elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
+      elf_tdata (abfd)->core->program
+       = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
+      elf_tdata (abfd)->core->command
+       = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
+    }
+
+  /* Note that for some reason, a spurious space is tacked
+     onto the end of the args in some (at least one anyway)
+     implementations, so strip it off if it exists.  */
+
+  {
+    char *command = elf_tdata (abfd)->core->command;
+    int n = strlen (command);
+
+    if (0 < n && command[n - 1] == ' ')
+      command[n - 1] = '\0';
+  }
+
+  return TRUE;
+}
+
+char *
+_bfd_aarch64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
+                                 ...)
+{
+  switch (note_type)
+    {
+    default:
+      return NULL;
+
+    case NT_PRPSINFO:
+      {
+        char data[136];
+        va_list ap;
+
+        va_start (ap, note_type);
+        memset (data, 0, sizeof (data));
+        strncpy (data + 40, va_arg (ap, const char *), 16);
+        strncpy (data + 56, va_arg (ap, const char *), 80);
+        va_end (ap);
+
+        return elfcore_write_note (abfd, buf, bufsiz, "CORE",
+                                  note_type, data, sizeof (data));
+      }
+
+    case NT_PRSTATUS:
+      {
+        char data[392];
+        va_list ap;
+        long pid;
+        int cursig;
+        const void *greg;
+
+        va_start (ap, note_type);
+        memset (data, 0, sizeof (data));
+        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, 272);
+        va_end (ap);
+
+        return elfcore_write_note (abfd, buf, bufsiz, "CORE",
+                                  note_type, data, sizeof (data));
+      }
+    }
+}
index 5ca3b7f7bad93f19ddbd66c857e0e66ae08a7048..880810438664448d74e8ab37a76eafd5c94c9f5c 100644 (file)
@@ -23,8 +23,8 @@
 #include "stdint.h"
 
 /* Take the PAGE component of an address or offset.  */
-#define PG(x) ((x) & ~ (bfd_vma) 0xfff)
-#define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff)
+#define PG(x)        ((x) & ~ (bfd_vma) 0xfff)
+#define PG_OFFSET(x) ((x) &   (bfd_vma) 0xfff)
 
 extern bfd_reloc_status_type
 _bfd_aarch64_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type,
@@ -42,6 +42,13 @@ _bfd_aarch64_elf_add_symbol_hook (bfd *, struct bfd_link_info *,
 extern bfd_boolean
 _bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *);
 
+extern bfd_boolean
+_bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *);
+
+extern char *
+_bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...);
 
 #define elf_backend_add_symbol_hook    _bfd_aarch64_elf_add_symbol_hook
 #define elf_backend_grok_prstatus      _bfd_aarch64_elf_grok_prstatus
+#define elf_backend_grok_psinfo         _bfd_aarch64_elf_grok_psinfo
+#define elf_backend_write_core_note     _bfd_aarch64_elf_write_core_note