2010-06-17 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / bfd / netbsd-core.c
index 250c6f4f1d5cad70942eac41de4acfc337b5ec9b..397f1d086acf50d1975754462bdb34ad0507626b 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD back end for NetBSD style core files
    Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
 /* BFD back end for NetBSD style core files
    Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004
+   2002, 2003, 2004, 2005, 2006, 2007
    Free Software Foundation, Inc.
    Written by Paul Kranenburg, EUR
 
    Free Software Foundation, Inc.
    Written by Paul Kranenburg, EUR
 
@@ -8,7 +8,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "libaout.h"           /* BFD a.out internal data structures.  */
 
 #include "libbfd.h"
 #include "libaout.h"           /* BFD a.out internal data structures.  */
 
    NetBSD/sparc64 overlaps with M_MIPS1.  */
 #define M_SPARC64_OPENBSD      M_MIPS1
 
    NetBSD/sparc64 overlaps with M_MIPS1.  */
 #define M_SPARC64_OPENBSD      M_MIPS1
 
+/* Offset of StackGhost cookie within `struct md_coredump' on
+   OpenBSD/sparc.  */
+#define SPARC_WCOOKIE_OFFSET   344
+
+/* Offset of StackGhost cookie within `struct md_coredump' on
+   OpenBSD/sparc64.  */
+#define SPARC64_WCOOKIE_OFFSET 832
+
+#define netbsd_core_file_matches_executable_p generic_core_file_matches_executable_p
+
 struct netbsd_core_struct
 {
   struct core core;
 } *rawptr;
 
 struct netbsd_core_struct
 {
   struct core core;
 } *rawptr;
 
-/* Forward declarations.  */
-
-static const bfd_target *netbsd_core_file_p
-  PARAMS ((bfd *abfd));
-static char *netbsd_core_file_failing_command
-  PARAMS ((bfd *abfd));
-static int netbsd_core_file_failing_signal
-  PARAMS ((bfd *abfd));
-static bfd_boolean netbsd_core_file_matches_executable_p
-  PARAMS ((bfd *core_bfd, bfd *exec_bfd));
-static void swap_abort
-  PARAMS ((void));
-
 /* Handle NetBSD-style core dump file.  */
 
 static const bfd_target *
 /* Handle NetBSD-style core dump file.  */
 
 static const bfd_target *
-netbsd_core_file_p (abfd)
-     bfd *abfd;
-
+netbsd_core_file_p (bfd *abfd)
 {
 {
-  int i, val;
+  int val;
+  unsigned i;
   file_ptr offset;
   asection *asect;
   struct core core;
   struct coreseg coreseg;
   bfd_size_type amt = sizeof core;
 
   file_ptr offset;
   asection *asect;
   struct core core;
   struct coreseg coreseg;
   bfd_size_type amt = sizeof core;
 
-  val = bfd_bread ((void *) &core, amt, abfd);
+  val = bfd_bread (&core, amt, abfd);
   if (val != sizeof core)
     {
       /* Too small to be a core file.  */
   if (val != sizeof core)
     {
       /* Too small to be a core file.  */
@@ -97,7 +94,7 @@ netbsd_core_file_p (abfd)
       if (bfd_seek (abfd, offset, SEEK_SET) != 0)
        goto punt;
 
       if (bfd_seek (abfd, offset, SEEK_SET) != 0)
        goto punt;
 
-      val = bfd_bread ((void *) &coreseg, (bfd_size_type) sizeof coreseg, abfd);
+      val = bfd_bread (&coreseg, sizeof coreseg, abfd);
       if (val != sizeof coreseg)
        {
          bfd_set_error (bfd_error_file_truncated);
       if (val != sizeof coreseg)
        {
          bfd_set_error (bfd_error_file_truncated);
@@ -130,40 +127,105 @@ netbsd_core_file_p (abfd)
          flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        }
          flags = SEC_ALLOC + SEC_HAS_CONTENTS;
          break;
        }
-      asect = bfd_make_section_anyway (abfd, sname);
+      asect = bfd_make_section_anyway_with_flags (abfd, sname, flags);
       if (asect == NULL)
        goto punt;
 
       if (asect == NULL)
        goto punt;
 
-      asect->flags = flags;
-      asect->_raw_size = coreseg.c_size;
+      asect->size = coreseg.c_size;
       asect->vma = coreseg.c_addr;
       asect->filepos = offset;
       asect->alignment_power = 2;
 
       asect->vma = coreseg.c_addr;
       asect->filepos = offset;
       asect->alignment_power = 2;
 
+      if (CORE_GETFLAG (coreseg) == CORE_CPU)
+       {
+         bfd_size_type wcookie_offset;
+
+         switch (CORE_GETMID (core))
+           {
+           case M_SPARC_NETBSD:
+             wcookie_offset = SPARC_WCOOKIE_OFFSET;
+             break;
+           case M_SPARC64_OPENBSD:
+             wcookie_offset = SPARC64_WCOOKIE_OFFSET;
+             break;
+           default:
+             wcookie_offset = 0;
+             break;
+           }
+
+         if (wcookie_offset > 0 && coreseg.c_size > wcookie_offset)
+           {
+             /* Truncate the .reg section.  */
+             asect->size = wcookie_offset;
+
+             /* And create the .wcookie section.  */
+             flags = SEC_ALLOC + SEC_HAS_CONTENTS;
+             asect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
+                                                         flags);
+             if (asect == NULL)
+               goto punt;
+
+             asect->size = coreseg.c_size - wcookie_offset;
+             asect->vma = 0;
+             asect->filepos = offset + wcookie_offset;
+             asect->alignment_power = 2;
+           }
+       }
+
       offset += coreseg.c_size;
     }
 
       offset += coreseg.c_size;
     }
 
- /* Set architecture from machine ID.  */
- switch (CORE_GETMID (core))
-   {
-   case M_X86_64_NETBSD:
-     bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
-     break;
-
-   case M_386_NETBSD:
-     bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
-     break;
-
-   case M_SPARC_NETBSD:
-     bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
-     break;
-
-   case M_SPARC64_NETBSD:
-   case M_SPARC64_OPENBSD:
-     bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
-     break;
-   }
+  /* Set architecture from machine ID.  */
+  switch (CORE_GETMID (core))
+    {
+    case M_ALPHA_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
+      break;
+
+    case M_ARM6_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_3);
+      break;
+
+    case M_X86_64_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
+      break;
+
+    case M_386_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
+      break;
+
+    case M_68K_NETBSD:
+    case M_68K4K_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
+      break;
+
+    case M_88K_OPENBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_m88k, 0);
+      break;
+
+    case M_HPPA_OPENBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
+      break;
+
+    case M_POWERPC_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
+      break;
+
+    case M_SPARC_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
+      break;
+
+    case M_SPARC64_NETBSD:
+    case M_SPARC64_OPENBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
+      break;
+
+    case M_VAX_NETBSD:
+    case M_VAX4K_NETBSD:
+      bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
+      break;
+    }
+
   /* OK, we believe you.  You're a core file (sure, sure).  */
   return abfd->xvec;
 
   /* OK, we believe you.  You're a core file (sure, sure).  */
   return abfd->xvec;
 
@@ -175,34 +237,23 @@ netbsd_core_file_p (abfd)
 }
 
 static char*
 }
 
 static char*
-netbsd_core_file_failing_command (abfd)
-       bfd *abfd;
+netbsd_core_file_failing_command (bfd *abfd)
 {
 {
- /*return core_command (abfd);*/
 /*return core_command (abfd);*/
   return abfd->tdata.netbsd_core_data->core.c_name;
 }
 
 static int
   return abfd->tdata.netbsd_core_data->core.c_name;
 }
 
 static int
-netbsd_core_file_failing_signal (abfd)
-       bfd *abfd;
+netbsd_core_file_failing_signal (bfd *abfd)
 {
   /*return core_signal (abfd);*/
   return abfd->tdata.netbsd_core_data->core.c_signo;
 }
 {
   /*return core_signal (abfd);*/
   return abfd->tdata.netbsd_core_data->core.c_signo;
 }
-
-static bfd_boolean
-netbsd_core_file_matches_executable_p  (core_bfd, exec_bfd)
-     bfd *core_bfd ATTRIBUTE_UNUSED;
-     bfd *exec_bfd ATTRIBUTE_UNUSED;
-{
-  /* FIXME, We have no way of telling at this point.  */
-  return TRUE;
-}
 \f
 /* If somebody calls any byte-swapping routines, shoot them.  */
 
 static void
 \f
 /* If somebody calls any byte-swapping routines, shoot them.  */
 
 static void
-swap_abort ()
+swap_abort (void)
 {
  /* This way doesn't require any declaration for ANSI to fuck up.  */
   abort ();
 {
  /* This way doesn't require any declaration for ANSI to fuck up.  */
   abort ();
@@ -224,10 +275,11 @@ const bfd_target netbsd_core_vec =
     (HAS_RELOC | EXEC_P |      /* Object flags.  */
      HAS_LINENO | HAS_DEBUG |
      HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
     (HAS_RELOC | EXEC_P |      /* Object flags.  */
      HAS_LINENO | HAS_DEBUG |
      HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
-    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags.  */
-    0,                                                    /* Symbol prefix.  */
-    ' ',                                                  /* ar_pad_char.  */
-    16,                                                           /* ar_max_namelen.  */
+    (SEC_HAS_CONTENTS |                /* Section flags.  */
+     SEC_ALLOC | SEC_LOAD | SEC_RELOC),
+    0,                         /* Symbol prefix.  */
+    ' ',                       /* ar_pad_char.  */
+    16,                                /* ar_max_namelen.  */
     NO_GET64, NO_GETS64, NO_PUT64,     /* 64 bit data.  */
     NO_GET, NO_GETS, NO_PUT,           /* 32 bit data.  */
     NO_GET, NO_GETS, NO_PUT,           /* 16 bit data.  */
     NO_GET64, NO_GETS64, NO_PUT64,     /* 64 bit data.  */
     NO_GET, NO_GETS, NO_PUT,           /* 32 bit data.  */
     NO_GET, NO_GETS, NO_PUT,           /* 16 bit data.  */
This page took 0.028961 seconds and 4 git commands to generate.