cris bfd config
[binutils-gdb.git] / bfd / netbsd-core.c
index fca801347da11a84f4179061ee3e8a3480cbe9a5..cb215937da6f02451178064dedaeb7374c8780b4 100644 (file)
@@ -1,14 +1,12 @@
 /* BFD back end for NetBSD style core files
 /* BFD back end for NetBSD style core files
-   Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004
-   Free Software Foundation, Inc.
+   Copyright (C) 1988-2022 Free Software Foundation, Inc.
    Written by Paul Kranenburg, EUR
 
    This file is part of BFD, the Binary File Descriptor library.
 
    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
    Written by Paul Kranenburg, EUR
 
    This file is part of BFD, the Binary File Descriptor library.
 
    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 "libbfd.h"
-#include "libaout.h"           /* BFD a.out internal data structures.  */
+#include "libaout.h"          /* BFD a.out internal data structures.  */
 
 #include <sys/param.h>
 #include <sys/dir.h>
 
 #include <sys/param.h>
 #include <sys/dir.h>
 
 /* Offset of StackGhost cookie within `struct md_coredump' on
    OpenBSD/sparc.  */
 
 /* Offset of StackGhost cookie within `struct md_coredump' on
    OpenBSD/sparc.  */
-#define CORE_WCOOKIE_OFFSET    344
+#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
+#define netbsd_core_file_pid _bfd_nocore_core_file_pid
 
 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.  */
 
 /* Handle NetBSD-style core dump file.  */
 
-static const bfd_target *
-netbsd_core_file_p (abfd)
-     bfd *abfd;
-
+static bfd_cleanup
+netbsd_core_file_p (bfd *abfd)
 {
 {
-  int i, val;
+  int val;
+  unsigned i;
   file_ptr offset;
   asection *asect;
   struct core core;
   struct coreseg coreseg;
   file_ptr offset;
   asection *asect;
   struct core core;
   struct coreseg coreseg;
-  bfd_size_type amt = sizeof core;
+  size_t 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.  */
@@ -101,7 +93,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);
@@ -134,61 +126,103 @@ 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_GETMID (core) == M_SPARC_NETBSD
-         && CORE_GETFLAG (coreseg) == CORE_CPU
-         && coreseg.c_size > CORE_WCOOKIE_OFFSET)
+      if (CORE_GETFLAG (coreseg) == CORE_CPU)
        {
        {
-         /* Truncate the .reg section.  */
-         asect->_raw_size = CORE_WCOOKIE_OFFSET;
-
-         /* And create the .wcookie section.  */
-         asect = bfd_make_section_anyway (abfd, ".wcookie");
-         if (asect == NULL)
-           goto punt;
-
-         asect->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
-         asect->_raw_size = 4;
-         asect->vma = 0;
-         asect->filepos = offset + CORE_WCOOKIE_OFFSET;
-         asect->alignment_power = 2;
+         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_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).  */
   /* OK, we believe you.  You're a core file (sure, sure).  */
-  return abfd->xvec;
+  return _bfd_no_cleanup;
 
  punt:
   bfd_release (abfd, abfd->tdata.any);
 
  punt:
   bfd_release (abfd, abfd->tdata.any);
@@ -198,34 +232,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 ();
@@ -238,7 +261,7 @@ swap_abort ()
 #define        NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
 #define        NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
 
 #define        NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
 #define        NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
 
-const bfd_target netbsd_core_vec =
+const bfd_target core_netbsd_vec =
   {
     "netbsd-core",
     bfd_target_unknown_flavour,
   {
     "netbsd-core",
     bfd_target_unknown_flavour,
@@ -247,10 +270,13 @@ 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.  */
+    0,                         /* Match priority.  */
+    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
     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.  */
@@ -265,12 +291,16 @@ const bfd_target netbsd_core_vec =
       netbsd_core_file_p               /* A core file.  */
     },
     {                                  /* bfd_set_format.  */
       netbsd_core_file_p               /* A core file.  */
     },
     {                                  /* bfd_set_format.  */
-      bfd_false, bfd_false,
-      bfd_false, bfd_false
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error
     },
     {                                  /* bfd_write_contents.  */
     },
     {                                  /* bfd_write_contents.  */
-      bfd_false, bfd_false,
-      bfd_false, bfd_false
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error,
+      _bfd_bool_bfd_false_error
     },
 
     BFD_JUMP_TABLE_GENERIC (_bfd_generic),
     },
 
     BFD_JUMP_TABLE_GENERIC (_bfd_generic),
@@ -285,5 +315,5 @@ const bfd_target netbsd_core_vec =
 
     NULL,
 
 
     NULL,
 
-    (PTR) 0                            /* Backend_data.  */
+    NULL                               /* Backend_data.  */
   };
   };