OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [irix-core.c] - Diff between revs 1182 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 1182 Rev 1765
/* BFD back-end for Irix core files.
/* BFD back-end for Irix core files.
   Copyright 1993, 1994, 1996, 1999, 2001, 2002
   Copyright 1993, 1994, 1996, 1999, 2001, 2002
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Written by Stu Grossman, Cygnus Support.
   Written by Stu Grossman, Cygnus Support.
   Converted to back-end form by Ian Lance Taylor, Cygnus Support
   Converted to back-end form by Ian Lance Taylor, Cygnus Support
 
 
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
 
 
This program is free software; you can redistribute it and/or modify
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
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 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
/* This file can only be compiled on systems which use Irix style core
/* This file can only be compiled on systems which use Irix style core
   files (namely, Irix 4 and Irix 5, so far).  */
   files (namely, Irix 4 and Irix 5, so far).  */
 
 
#include "bfd.h"
#include "bfd.h"
#include "sysdep.h"
#include "sysdep.h"
#include "libbfd.h"
#include "libbfd.h"
 
 
#ifdef IRIX_CORE
#ifdef IRIX_CORE
 
 
#include <core.out.h>
#include <core.out.h>
 
 
struct sgi_core_struct
struct sgi_core_struct
{
{
  int sig;
  int sig;
  char cmd[CORE_NAMESIZE];
  char cmd[CORE_NAMESIZE];
};
};
 
 
#define core_hdr(bfd) ((bfd)->tdata.sgi_core_data)
#define core_hdr(bfd) ((bfd)->tdata.sgi_core_data)
#define core_signal(bfd) (core_hdr(bfd)->sig)
#define core_signal(bfd) (core_hdr(bfd)->sig)
#define core_command(bfd) (core_hdr(bfd)->cmd)
#define core_command(bfd) (core_hdr(bfd)->cmd)
 
 
static asection *make_bfd_asection
static asection *make_bfd_asection
  PARAMS ((bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr));
  PARAMS ((bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr));
static const bfd_target *irix_core_core_file_p PARAMS ((bfd *));
static const bfd_target *irix_core_core_file_p PARAMS ((bfd *));
static char *irix_core_core_file_failing_command PARAMS ((bfd *));
static char *irix_core_core_file_failing_command PARAMS ((bfd *));
static int irix_core_core_file_failing_signal PARAMS ((bfd *));
static int irix_core_core_file_failing_signal PARAMS ((bfd *));
static boolean irix_core_core_file_matches_executable_p
static boolean irix_core_core_file_matches_executable_p
  PARAMS ((bfd *, bfd *));
  PARAMS ((bfd *, bfd *));
static void swap_abort PARAMS ((void));
static void swap_abort PARAMS ((void));
 
 
static asection *
static asection *
make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
     bfd *abfd;
     bfd *abfd;
     const char *name;
     const char *name;
     flagword flags;
     flagword flags;
     bfd_size_type _raw_size;
     bfd_size_type _raw_size;
     bfd_vma vma;
     bfd_vma vma;
     file_ptr filepos;
     file_ptr filepos;
{
{
  asection *asect;
  asection *asect;
 
 
  asect = bfd_make_section_anyway (abfd, name);
  asect = bfd_make_section_anyway (abfd, name);
  if (!asect)
  if (!asect)
    return NULL;
    return NULL;
 
 
  asect->flags = flags;
  asect->flags = flags;
  asect->_raw_size = _raw_size;
  asect->_raw_size = _raw_size;
  asect->vma = vma;
  asect->vma = vma;
  asect->filepos = filepos;
  asect->filepos = filepos;
  asect->alignment_power = 4;
  asect->alignment_power = 4;
 
 
  return asect;
  return asect;
}
}
 
 
static const bfd_target *
static const bfd_target *
irix_core_core_file_p (abfd)
irix_core_core_file_p (abfd)
     bfd *abfd;
     bfd *abfd;
{
{
  int val;
  int val;
  int i;
  int i;
  char *secname;
  char *secname;
  struct coreout coreout;
  struct coreout coreout;
  struct idesc *idg, *idf, *ids;
  struct idesc *idg, *idf, *ids;
  bfd_size_type amt;
  bfd_size_type amt;
 
 
  val = bfd_bread ((PTR) &coreout, (bfd_size_type) sizeof coreout, abfd);
  val = bfd_bread ((PTR) &coreout, (bfd_size_type) sizeof coreout, abfd);
  if (val != sizeof coreout)
  if (val != sizeof coreout)
    {
    {
      if (bfd_get_error () != bfd_error_system_call)
      if (bfd_get_error () != bfd_error_system_call)
        bfd_set_error (bfd_error_wrong_format);
        bfd_set_error (bfd_error_wrong_format);
      return 0;
      return 0;
    }
    }
 
 
#ifndef CORE_MAGICN32
#ifndef CORE_MAGICN32
#define CORE_MAGICN32 CORE_MAGIC
#define CORE_MAGICN32 CORE_MAGIC
#endif
#endif
  if ((coreout.c_magic != CORE_MAGIC && coreout.c_magic != CORE_MAGICN32)
  if ((coreout.c_magic != CORE_MAGIC && coreout.c_magic != CORE_MAGICN32)
      || coreout.c_version != CORE_VERSION1)
      || coreout.c_version != CORE_VERSION1)
    return 0;
    return 0;
 
 
  amt = sizeof (struct sgi_core_struct);
  amt = sizeof (struct sgi_core_struct);
  core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, amt);
  core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, amt);
  if (!core_hdr (abfd))
  if (!core_hdr (abfd))
    return NULL;
    return NULL;
 
 
  strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE);
  strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE);
  core_signal (abfd) = coreout.c_sigcause;
  core_signal (abfd) = coreout.c_sigcause;
 
 
  if (bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET) != 0)
  if (bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET) != 0)
    goto fail;
    goto fail;
 
 
  for (i = 0; i < coreout.c_nvmap; i++)
  for (i = 0; i < coreout.c_nvmap; i++)
    {
    {
      struct vmap vmap;
      struct vmap vmap;
 
 
      val = bfd_bread ((PTR) &vmap, (bfd_size_type) sizeof vmap, abfd);
      val = bfd_bread ((PTR) &vmap, (bfd_size_type) sizeof vmap, abfd);
      if (val != sizeof vmap)
      if (val != sizeof vmap)
        break;
        break;
 
 
      switch (vmap.v_type)
      switch (vmap.v_type)
        {
        {
        case VDATA:
        case VDATA:
          secname = ".data";
          secname = ".data";
          break;
          break;
        case VSTACK:
        case VSTACK:
          secname = ".stack";
          secname = ".stack";
          break;
          break;
#ifdef VMAPFILE
#ifdef VMAPFILE
        case VMAPFILE:
        case VMAPFILE:
          secname = ".mapfile";
          secname = ".mapfile";
          break;
          break;
#endif
#endif
        default:
        default:
          continue;
          continue;
        }
        }
 
 
      /* A file offset of zero means that the section is not contained
      /* A file offset of zero means that the section is not contained
         in the corefile.  */
         in the corefile.  */
      if (vmap.v_offset == 0)
      if (vmap.v_offset == 0)
        continue;
        continue;
 
 
      if (!make_bfd_asection (abfd, secname,
      if (!make_bfd_asection (abfd, secname,
                              SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
                              SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
                              vmap.v_len,
                              vmap.v_len,
                              vmap.v_vaddr,
                              vmap.v_vaddr,
                              vmap.v_offset))
                              vmap.v_offset))
        goto fail;
        goto fail;
    }
    }
 
 
  /* Make sure that the regs are contiguous within the core file. */
  /* Make sure that the regs are contiguous within the core file. */
 
 
  idg = &coreout.c_idesc[I_GPREGS];
  idg = &coreout.c_idesc[I_GPREGS];
  idf = &coreout.c_idesc[I_FPREGS];
  idf = &coreout.c_idesc[I_FPREGS];
  ids = &coreout.c_idesc[I_SPECREGS];
  ids = &coreout.c_idesc[I_SPECREGS];
 
 
  if (idg->i_offset + idg->i_len != idf->i_offset
  if (idg->i_offset + idg->i_len != idf->i_offset
      || idf->i_offset + idf->i_len != ids->i_offset)
      || idf->i_offset + idf->i_len != ids->i_offset)
    goto fail;                  /* Can't deal with non-contig regs */
    goto fail;                  /* Can't deal with non-contig regs */
 
 
  if (bfd_seek (abfd, idg->i_offset, SEEK_SET) != 0)
  if (bfd_seek (abfd, idg->i_offset, SEEK_SET) != 0)
    goto fail;
    goto fail;
 
 
  if (!make_bfd_asection (abfd, ".reg",
  if (!make_bfd_asection (abfd, ".reg",
                          SEC_HAS_CONTENTS,
                          SEC_HAS_CONTENTS,
                          idg->i_len + idf->i_len + ids->i_len,
                          idg->i_len + idf->i_len + ids->i_len,
                          0,
                          0,
                          idg->i_offset))
                          idg->i_offset))
    goto fail;
    goto fail;
 
 
  /* OK, we believe you.  You're a core file (sure, sure).  */
  /* OK, we believe you.  You're a core file (sure, sure).  */
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, 0);
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, 0);
 
 
  return abfd->xvec;
  return abfd->xvec;
 
 
 fail:
 fail:
  bfd_release (abfd, core_hdr (abfd));
  bfd_release (abfd, core_hdr (abfd));
  core_hdr (abfd) = NULL;
  core_hdr (abfd) = NULL;
  bfd_section_list_clear (abfd);
  bfd_section_list_clear (abfd);
  return NULL;
  return NULL;
}
}
 
 
static char *
static char *
irix_core_core_file_failing_command (abfd)
irix_core_core_file_failing_command (abfd)
     bfd *abfd;
     bfd *abfd;
{
{
  return core_command (abfd);
  return core_command (abfd);
}
}
 
 
static int
static int
irix_core_core_file_failing_signal (abfd)
irix_core_core_file_failing_signal (abfd)
     bfd *abfd;
     bfd *abfd;
{
{
  return core_signal (abfd);
  return core_signal (abfd);
}
}
 
 
static boolean
static boolean
irix_core_core_file_matches_executable_p (core_bfd, exec_bfd)
irix_core_core_file_matches_executable_p (core_bfd, exec_bfd)
     bfd *core_bfd, *exec_bfd;
     bfd *core_bfd, *exec_bfd;
{
{
  return true;                  /* XXX - FIXME */
  return true;                  /* XXX - FIXME */
}
}
 
 
/* If somebody calls any byte-swapping routines, shoot them.  */
/* If somebody calls any byte-swapping routines, shoot them.  */
static void
static void
swap_abort()
swap_abort()
{
{
  abort(); /* 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 */
}
}
#define NO_GET  ((bfd_vma (*) PARAMS ((   const bfd_byte *))) swap_abort )
#define NO_GET  ((bfd_vma (*) PARAMS ((   const bfd_byte *))) swap_abort )
#define NO_PUT  ((void    (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
#define NO_PUT  ((void    (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
#define NO_SIGNED_GET \
#define NO_SIGNED_GET \
  ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
  ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
 
 
const bfd_target irix_core_vec =
const bfd_target irix_core_vec =
  {
  {
    "irix-core",
    "irix-core",
    bfd_target_unknown_flavour,
    bfd_target_unknown_flavour,
    BFD_ENDIAN_BIG,             /* target byte order */
    BFD_ENDIAN_BIG,             /* target byte order */
    BFD_ENDIAN_BIG,             /* target headers byte order */
    BFD_ENDIAN_BIG,             /* target headers byte order */
    (HAS_RELOC | EXEC_P |       /* object flags */
    (HAS_RELOC | EXEC_P |       /* object flags */
     HAS_LINENO | HAS_DEBUG |
     HAS_LINENO | HAS_DEBUG |
     HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
     HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
    0,                                                      /* symbol prefix */
    0,                                                      /* symbol prefix */
    ' ',                                                   /* ar_pad_char */
    ' ',                                                   /* ar_pad_char */
    16,                                                    /* ar_max_namelen */
    16,                                                    /* ar_max_namelen */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit data */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit hdrs */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit hdrs */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit hdrs */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit hdrs */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit hdrs */
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit hdrs */
 
 
    {                           /* bfd_check_format */
    {                           /* bfd_check_format */
     _bfd_dummy_target,         /* unknown format */
     _bfd_dummy_target,         /* unknown format */
     _bfd_dummy_target,         /* object file */
     _bfd_dummy_target,         /* object file */
     _bfd_dummy_target,         /* archive */
     _bfd_dummy_target,         /* archive */
     irix_core_core_file_p      /* a core file */
     irix_core_core_file_p      /* a core file */
    },
    },
    {                           /* bfd_set_format */
    {                           /* bfd_set_format */
     bfd_false, bfd_false,
     bfd_false, bfd_false,
     bfd_false, bfd_false
     bfd_false, bfd_false
    },
    },
    {                           /* bfd_write_contents */
    {                           /* bfd_write_contents */
     bfd_false, bfd_false,
     bfd_false, bfd_false,
     bfd_false, bfd_false
     bfd_false, bfd_false
    },
    },
 
 
    BFD_JUMP_TABLE_GENERIC (_bfd_generic),
    BFD_JUMP_TABLE_GENERIC (_bfd_generic),
    BFD_JUMP_TABLE_COPY (_bfd_generic),
    BFD_JUMP_TABLE_COPY (_bfd_generic),
    BFD_JUMP_TABLE_CORE (irix_core),
    BFD_JUMP_TABLE_CORE (irix_core),
    BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
    BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
    BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
    BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
    BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
    BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
    BFD_JUMP_TABLE_WRITE (_bfd_generic),
    BFD_JUMP_TABLE_WRITE (_bfd_generic),
    BFD_JUMP_TABLE_LINK (_bfd_nolink),
    BFD_JUMP_TABLE_LINK (_bfd_nolink),
    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
 
    NULL,
    NULL,
 
 
    (PTR) 0                      /* backend_data */
    (PTR) 0                      /* backend_data */
};
};
 
 
#endif /* IRIX_CORE */
#endif /* IRIX_CORE */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.