[BACK]Return to hppabsd-core.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils.old / dist / bfd

Annotation of src/external/gpl3/binutils.old/dist/bfd/hppabsd-core.c, Revision 1.3

1.1       christos    1: /* BFD back-end for HPPA BSD core files.
1.3     ! christos    2:    Copyright (C) 1993-2015 Free Software Foundation, Inc.
1.1       christos    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:    Written by the Center for Software Science at the University of Utah
                     22:    and by Cygnus Support.
                     23:
                     24:    The core file structure for the Utah 4.3BSD and OSF1 ports on the
                     25:    PA is a mix between traditional cores and hpux cores -- just
                     26:    different enough that supporting this format would tend to add
                     27:    gross hacks to trad-core.c or hpux-core.c.  So instead we keep any
                     28:    gross hacks isolated to this file.  */
                     29:
                     30: /* This file can only be compiled on systems which use HPPA-BSD style
                     31:    core files.
                     32:
                     33:    I would not expect this to be of use to any other host/target, but
                     34:    you never know.  */
                     35:
                     36: #include "sysdep.h"
                     37: #include "bfd.h"
                     38: #include "libbfd.h"
                     39:
                     40: #if defined (HOST_HPPABSD)
                     41:
                     42: #include "machine/vmparam.h"
                     43:
                     44: #include <sys/param.h>
                     45: #include <sys/dir.h>
                     46: #include <signal.h>
                     47: #include <machine/reg.h>
                     48: #include <sys/user.h>          /* After a.out.h  */
                     49: #include <sys/file.h>
                     50:
                     51: #define hppabsd_core_core_file_matches_executable_p generic_core_file_matches_executable_p
                     52: #define hppabsd_core_core_file_pid _bfd_nocore_core_file_pid
                     53:
                     54: /* These are stored in the bfd's tdata.  */
                     55:
                     56: struct hppabsd_core_struct
                     57: {
                     58:   int sig;
                     59:   char cmd[MAXCOMLEN + 1];
                     60:   asection *data_section;
                     61:   asection *stack_section;
                     62:   asection *reg_section;
                     63: };
                     64:
                     65: #define core_hdr(bfd) ((bfd)->tdata.hppabsd_core_data)
                     66: #define core_signal(bfd)   (core_hdr(bfd)->sig)
                     67: #define core_command(bfd)  (core_hdr(bfd)->cmd)
                     68: #define core_datasec(bfd)  (core_hdr(bfd)->data_section)
                     69: #define core_stacksec(bfd) (core_hdr(bfd)->stack_section)
                     70: #define core_regsec(bfd)   (core_hdr(bfd)->reg_section)
                     71:
                     72: static asection *
                     73: make_bfd_asection (bfd *abfd,
                     74:                   const char *name,
                     75:                   flagword flags,
                     76:                   bfd_size_type size,
                     77:                   file_ptr offset,
                     78:                   unsigned int alignment_power)
                     79: {
                     80:   asection *asect;
                     81:
                     82:   asect = bfd_make_section_with_flags (abfd, name, flags);
                     83:   if (!asect)
                     84:     return NULL;
                     85:
                     86:   asect->size = size;
                     87:   asect->filepos = offset;
                     88:   asect->alignment_power = alignment_power;
                     89:
                     90:   return asect;
                     91: }
                     92:
                     93: static const bfd_target *
                     94: hppabsd_core_core_file_p (bfd *abfd)
                     95: {
                     96:   int val;
                     97:   struct user u;
                     98:   struct hppabsd_core_struct *coredata;
                     99:   int clicksz;
                    100:
                    101:   /* Try to read in the u-area.  We will need information from this
                    102:      to know how to grok the rest of the core structures.  */
                    103:   val = bfd_bread ((void *) &u, (bfd_size_type) sizeof u, abfd);
                    104:   if (val != sizeof u)
                    105:     {
                    106:       if (bfd_get_error () != bfd_error_system_call)
                    107:        bfd_set_error (bfd_error_wrong_format);
                    108:       return NULL;
                    109:     }
                    110:
                    111:   /* Get the page size out of the u structure.  This will be different
                    112:      for PA 1.0 machines and PA 1.1 machines.   Yuk!  */
                    113:   clicksz = u.u_pcb.pcb_pgsz;
                    114:
                    115:   /* clicksz must be a power of two >= 2k.  */
                    116:   if (clicksz < 0x800
                    117:       || clicksz != (clicksz & -clicksz))
                    118:     {
                    119:       bfd_set_error (bfd_error_wrong_format);
                    120:       return NULL;
                    121:     }
                    122:
                    123:   /* Sanity checks.  Make sure the size of the core file matches the
                    124:      the size computed from information within the core itself.  */
                    125:   {
                    126:     struct stat statbuf;
                    127:
                    128:     if (bfd_stat (abfd, &statbuf) < 0)
                    129:       return NULL;
                    130:
                    131:     if (NBPG * (UPAGES + u.u_dsize + u.u_ssize) > statbuf.st_size)
                    132:       {
                    133:        bfd_set_error (bfd_error_file_truncated);
                    134:        return NULL;
                    135:       }
                    136:     if (clicksz * (UPAGES + u.u_dsize + u.u_ssize) < statbuf.st_size)
                    137:       {
                    138:        /* The file is too big.  Maybe it's not a core file
                    139:           or we otherwise have bad values for u_dsize and u_ssize).  */
                    140:        bfd_set_error (bfd_error_wrong_format);
                    141:        return NULL;
                    142:       }
                    143:   }
                    144:
                    145:   /* OK, we believe you.  You're a core file (sure, sure).  */
                    146:
                    147:   coredata = (struct hppabsd_core_struct *)
                    148:     bfd_zalloc (abfd, (bfd_size_type) sizeof (struct hppabsd_core_struct));
                    149:   if (!coredata)
                    150:     return NULL;
                    151:
                    152:   /* Make the core data and available via the tdata part of the BFD.  */
                    153:   abfd->tdata.hppabsd_core_data = coredata;
                    154:
                    155:   /* Create the sections.  */
                    156:   core_stacksec (abfd) = make_bfd_asection (abfd, ".stack",
                    157:                                           SEC_ALLOC + SEC_HAS_CONTENTS,
                    158:                                           clicksz * u.u_ssize,
                    159:                                           NBPG * (USIZE + KSTAKSIZE)
                    160:                                             + clicksz * u.u_dsize, 2);
                    161:   if (core_stacksec (abfd) == NULL)
                    162:     goto fail;
                    163:   core_stacksec (abfd)->vma = USRSTACK;
                    164:
                    165:   core_datasec (abfd) = make_bfd_asection (abfd, ".data",
                    166:                                          SEC_ALLOC + SEC_LOAD
                    167:                                            + SEC_HAS_CONTENTS,
                    168:                                          clicksz * u.u_dsize,
                    169:                                          NBPG * (USIZE + KSTAKSIZE), 2);
                    170:   if (core_datasec (abfd) == NULL)
                    171:     goto fail;
                    172:   core_datasec (abfd)->vma = UDATASEG;
                    173:
                    174:   core_regsec (abfd) = make_bfd_asection (abfd, ".reg",
                    175:                                         SEC_HAS_CONTENTS,
                    176:                                         KSTAKSIZE * NBPG,
                    177:                                         NBPG * USIZE, 2);
                    178:   if (core_regsec (abfd) == NULL)
                    179:     goto fail;
                    180:   core_regsec (abfd)->vma = 0;
                    181:
                    182:   strncpy (core_command (abfd), u.u_comm, MAXCOMLEN + 1);
                    183:   core_signal (abfd) = u.u_code;
                    184:   return abfd->xvec;
                    185:
                    186:  fail:
                    187:   bfd_release (abfd, abfd->tdata.any);
                    188:   abfd->tdata.any = NULL;
                    189:   bfd_section_list_clear (abfd);
                    190:   return NULL;
                    191: }
                    192:
                    193: static char *
                    194: hppabsd_core_core_file_failing_command (bfd *abfd)
                    195: {
                    196:   return core_command (abfd);
                    197: }
                    198:
                    199: static int
                    200: hppabsd_core_core_file_failing_signal (bfd *abfd)
                    201: {
                    202:   return core_signal (abfd);
                    203: }
                    204: 
                    205: /* If somebody calls any byte-swapping routines, shoot them.  */
                    206: static void
                    207: swap_abort (void)
                    208: {
                    209:   /* This way doesn't require any declaration for ANSI to fuck up.  */
                    210:   abort ();
                    211: }
                    212:
                    213: #define        NO_GET ((bfd_vma (*) (const void *)) swap_abort)
                    214: #define        NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
                    215: #define        NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
                    216: #define        NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
                    217: #define        NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
                    218: #define        NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
                    219:
1.3     ! christos  220: const bfd_target core_hppabsd_vec =
1.1       christos  221:   {
                    222:     "hppabsd-core",
                    223:     bfd_target_unknown_flavour,
                    224:     BFD_ENDIAN_BIG,            /* target byte order */
                    225:     BFD_ENDIAN_BIG,            /* target headers byte order */
                    226:     (HAS_RELOC | EXEC_P |      /* object flags */
                    227:      HAS_LINENO | HAS_DEBUG |
                    228:      HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
                    229:     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
                    230:     0,                                                    /* symbol prefix */
                    231:     ' ',                                                  /* ar_pad_char */
                    232:     16,                                                           /* ar_max_namelen */
                    233:     NO_GET64, NO_GETS64, NO_PUT64,     /* 64 bit data */
                    234:     NO_GET, NO_GETS, NO_PUT,           /* 32 bit data */
                    235:     NO_GET, NO_GETS, NO_PUT,           /* 16 bit data */
                    236:     NO_GET64, NO_GETS64, NO_PUT64,     /* 64 bit hdrs */
                    237:     NO_GET, NO_GETS, NO_PUT,           /* 32 bit hdrs */
                    238:     NO_GET, NO_GETS, NO_PUT,           /* 16 bit hdrs */
                    239:
                    240:     {                          /* bfd_check_format */
                    241:       _bfd_dummy_target,               /* unknown format */
                    242:       _bfd_dummy_target,               /* object file */
                    243:       _bfd_dummy_target,               /* archive */
                    244:       hppabsd_core_core_file_p         /* a core file */
                    245:     },
                    246:     {                          /* bfd_set_format */
                    247:       bfd_false, bfd_false,
                    248:       bfd_false, bfd_false
                    249:     },
                    250:     {                          /* bfd_write_contents */
                    251:       bfd_false, bfd_false,
                    252:       bfd_false, bfd_false
                    253:     },
                    254:
                    255:     BFD_JUMP_TABLE_GENERIC (_bfd_generic),
                    256:     BFD_JUMP_TABLE_COPY (_bfd_generic),
                    257:     BFD_JUMP_TABLE_CORE (hppabsd_core),
                    258:     BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
                    259:     BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
                    260:     BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
                    261:     BFD_JUMP_TABLE_WRITE (_bfd_generic),
                    262:     BFD_JUMP_TABLE_LINK (_bfd_nolink),
                    263:     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
                    264:
                    265:     NULL,
                    266:
                    267:     NULL                       /* backend_data */
                    268:   };
                    269: #endif

CVSweb <webmaster@jp.NetBSD.org>