* elf.c (elfcore_grok_openbsd_procinfo)
authorMark Kettenis <kettenis@gnu.org>
Wed, 18 Mar 2009 16:26:54 +0000 (16:26 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 18 Mar 2009 16:26:54 +0000 (16:26 +0000)
(elfcore_grok_openbsd_note): New functions.
(elf_parse_notes): Handle notes from OpenBSD ELF core files.

bfd/ChangeLog
bfd/elf.c

index 341eae1a2b291bfc1866dce5935394b6247942c2..750b2e26192789957054c7401ccf60009bf453eb 100644 (file)
@@ -1,3 +1,9 @@
+2009-03-18  Mark Kettenis  <kettenis@gnu.org>
+
+       * elf.c (elfcore_grok_openbsd_procinfo) 
+       (elfcore_grok_openbsd_note): New functions.
+       (elf_parse_notes): Handle notes from OpenBSD ELF core files.
+
 2009-03-18  Alan Modra  <amodra@bigpond.net.au>
 
        * vms-hdr.c: Don't include alloca.h.
index 8ca5ef9a62e07660510e51050e5881709024da8f..6aa6d1c64754889edecb04ea3a983022e486c308 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -8110,6 +8110,70 @@ elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
     /* NOTREACHED */
 }
 
+static bfd_boolean
+elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
+{
+  /* Signal number at offset 0x08. */
+  elf_tdata (abfd)->core_signal
+    = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
+
+  /* Process ID at offset 0x20. */
+  elf_tdata (abfd)->core_pid
+    = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
+
+  /* Command name at 0x48 (max 32 bytes, including nul). */
+  elf_tdata (abfd)->core_command
+    = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
+
+  return TRUE;
+}
+
+static bfd_boolean
+elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
+{
+  if (note->type == NT_OPENBSD_PROCINFO)
+    return elfcore_grok_openbsd_procinfo (abfd, note);
+
+  if (note->type == NT_OPENBSD_REGS)
+    return elfcore_make_note_pseudosection (abfd, ".reg", note);
+
+  if (note->type == NT_OPENBSD_FPREGS)
+    return elfcore_make_note_pseudosection (abfd, ".reg2", note);
+
+  if (note->type == NT_OPENBSD_XFPREGS)
+    return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
+
+  if (note->type == NT_OPENBSD_AUXV)
+    {
+      asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
+                                                          SEC_HAS_CONTENTS);
+
+      if (sect == NULL)
+       return FALSE;
+      sect->size = note->descsz;
+      sect->filepos = note->descpos;
+      sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
+
+      return TRUE;
+    }
+
+  if (note->type == NT_OPENBSD_WCOOKIE)
+    {
+      asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
+                                                          SEC_HAS_CONTENTS);
+
+      if (sect == NULL)
+       return FALSE;
+      sect->size = note->descsz;
+      sect->filepos = note->descpos;
+      sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
+
+      return TRUE;
+    }
+
+  return TRUE;
+}
+
 static bfd_boolean
 elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
 {
@@ -8597,6 +8661,11 @@ elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
              if (! elfcore_grok_netbsd_note (abfd, &in))
                return FALSE;
            }
+         else if (CONST_STRNEQ (in.namedata, "OpenBSD"))
+           {
+             if (! elfcore_grok_openbsd_note (abfd, &in))
+               return FALSE;
+           }
          else if (CONST_STRNEQ (in.namedata, "QNX"))
            {
              if (! elfcore_grok_nto_note (abfd, &in))