(root)/
binutils-2.41/
bfd/
osf-core.c
       1  /* BFD back-end for OSF/1 core files.
       2     Copyright (C) 1993-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of BFD, the Binary File Descriptor library.
       5  
       6     This program is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3 of the License, or
       9     (at your option) any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program; if not, write to the Free Software
      18     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  
      22  /* This file can only be compiled on systems which use OSF/1 style
      23     core files.  */
      24  
      25  #include "sysdep.h"
      26  #include "bfd.h"
      27  #include "libbfd.h"
      28  
      29  #include <sys/user.h>
      30  #ifdef OSF_CORE
      31  #include <sys/core.h>
      32  #endif
      33  
      34  /* forward declarations */
      35  
      36  #define osf_core_core_file_matches_executable_p generic_core_file_matches_executable_p
      37  #define osf_core_core_file_pid _bfd_nocore_core_file_pid
      38  
      39  /* These are stored in the bfd's tdata */
      40  
      41  struct osf_core_struct
      42  {
      43    int sig;
      44    char cmd[MAXCOMLEN + 1];
      45  };
      46  
      47  #define core_hdr(bfd) ((bfd)->tdata.osf_core_data)
      48  #define core_signal(bfd)  (core_hdr(bfd)->sig)
      49  #define core_command(bfd) (core_hdr(bfd)->cmd)
      50  
      51  static asection *
      52  make_bfd_asection (bfd *abfd,
      53  		   const char *name,
      54  		   flagword flags,
      55  		   bfd_size_type size,
      56  		   bfd_vma vma,
      57  		   file_ptr filepos)
      58  {
      59    asection *asect;
      60  
      61    asect = bfd_make_section_anyway_with_flags (abfd, name, flags);
      62    if (!asect)
      63      return NULL;
      64  
      65    asect->size = size;
      66    asect->vma = vma;
      67    asect->filepos = filepos;
      68    asect->alignment_power = 8;
      69  
      70    return asect;
      71  }
      72  
      73  static bfd_cleanup
      74  osf_core_core_file_p (bfd *abfd)
      75  {
      76    int val;
      77    int i;
      78    char *secname;
      79    struct core_filehdr core_header;
      80    size_t amt;
      81  
      82    amt = sizeof core_header;
      83    val = bfd_bread (& core_header, amt, abfd);
      84    if (val != sizeof core_header)
      85      return NULL;
      86  
      87    if (! startswith (core_header.magic, "Core"))
      88      return NULL;
      89  
      90    core_hdr (abfd) = (struct osf_core_struct *)
      91      bfd_zalloc (abfd, (bfd_size_type) sizeof (struct osf_core_struct));
      92    if (!core_hdr (abfd))
      93      return NULL;
      94  
      95    strncpy (core_command (abfd), core_header.name, MAXCOMLEN + 1);
      96    core_signal (abfd) = core_header.signo;
      97  
      98    for (i = 0; i < core_header.nscns; i++)
      99      {
     100        struct core_scnhdr core_scnhdr;
     101        flagword flags;
     102  
     103        amt = sizeof core_scnhdr;
     104        val = bfd_bread (& core_scnhdr, amt, abfd);
     105        if (val != sizeof core_scnhdr)
     106  	break;
     107  
     108        /* Skip empty sections.  */
     109        if (core_scnhdr.size == 0 || core_scnhdr.scnptr == 0)
     110  	continue;
     111  
     112        switch (core_scnhdr.scntype)
     113  	{
     114  	case SCNRGN:
     115  	  secname = ".data";
     116  	  flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
     117  	  break;
     118  	case SCNSTACK:
     119  	  secname = ".stack";
     120  	  flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
     121  	  break;
     122  	case SCNREGS:
     123  	  secname = ".reg";
     124  	  flags = SEC_HAS_CONTENTS;
     125  	  break;
     126  	default:
     127  	  _bfd_error_handler (_("unhandled OSF/1 core file section type %d"),
     128  			      core_scnhdr.scntype);
     129  	  continue;
     130  	}
     131  
     132        if (!make_bfd_asection (abfd, secname, flags,
     133  			      (bfd_size_type) core_scnhdr.size,
     134  			      (bfd_vma) core_scnhdr.vaddr,
     135  			      (file_ptr) core_scnhdr.scnptr))
     136  	goto fail;
     137      }
     138  
     139    /* OK, we believe you.  You're a core file (sure, sure).  */
     140  
     141    return _bfd_no_cleanup;
     142  
     143   fail:
     144    bfd_release (abfd, core_hdr (abfd));
     145    core_hdr (abfd) = NULL;
     146    bfd_section_list_clear (abfd);
     147    return NULL;
     148  }
     149  
     150  static char *
     151  osf_core_core_file_failing_command (bfd *abfd)
     152  {
     153    return core_command (abfd);
     154  }
     155  
     156  static int
     157  osf_core_core_file_failing_signal (bfd *abfd)
     158  {
     159    return core_signal (abfd);
     160  }
     161  
     162  /* If somebody calls any byte-swapping routines, shoot them.  */
     163  static void
     164  swap_abort (void)
     165  {
     166    abort (); /* This way doesn't require any declaration for ANSI to fuck up */
     167  }
     168  
     169  #define	NO_GET ((bfd_vma (*) (const void *)) swap_abort)
     170  #define	NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
     171  #define	NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
     172  #define	NO_GET64 ((uint64_t (*) (const void *)) swap_abort)
     173  #define	NO_PUT64 ((void (*) (uint64_t, void *)) swap_abort)
     174  #define	NO_GETS64 ((int64_t (*) (const void *)) swap_abort)
     175  
     176  const bfd_target core_osf_vec =
     177    {
     178      "osf-core",
     179      bfd_target_unknown_flavour,
     180      BFD_ENDIAN_LITTLE,		/* target byte order */
     181      BFD_ENDIAN_LITTLE,		/* target headers byte order */
     182      (HAS_RELOC | EXEC_P |	/* object flags */
     183       HAS_LINENO | HAS_DEBUG |
     184       HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
     185      (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
     186      0,				/* symbol prefix */
     187      ' ',			/* ar_pad_char */
     188      16,				/* ar_max_namelen */
     189      0,				/* match priority.  */
     190      TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
     191      NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     192      NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     193      NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
     194      NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit hdrs */
     195      NO_GET, NO_GETS, NO_PUT,		/* 32 bit hdrs */
     196      NO_GET, NO_GETS, NO_PUT,		/* 16 bit hdrs */
     197  
     198      {				/* bfd_check_format */
     199        _bfd_dummy_target,		/* unknown format */
     200        _bfd_dummy_target,		/* object file */
     201        _bfd_dummy_target,		/* archive */
     202        osf_core_core_file_p		/* a core file */
     203      },
     204      {				/* bfd_set_format */
     205        _bfd_bool_bfd_false_error,
     206        _bfd_bool_bfd_false_error,
     207        _bfd_bool_bfd_false_error,
     208        _bfd_bool_bfd_false_error
     209      },
     210      {				/* bfd_write_contents */
     211        _bfd_bool_bfd_false_error,
     212        _bfd_bool_bfd_false_error,
     213        _bfd_bool_bfd_false_error,
     214        _bfd_bool_bfd_false_error
     215      },
     216  
     217      BFD_JUMP_TABLE_GENERIC (_bfd_generic),
     218      BFD_JUMP_TABLE_COPY (_bfd_generic),
     219      BFD_JUMP_TABLE_CORE (osf_core),
     220      BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
     221      BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
     222      BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
     223      BFD_JUMP_TABLE_WRITE (_bfd_generic),
     224      BFD_JUMP_TABLE_LINK (_bfd_nolink),
     225      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
     226  
     227      NULL,
     228  
     229      NULL			/* backend_data */
     230    };