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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [irix-core.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* BFD back-end for Irix core files.
2
   Copyright 1993, 1994, 1996, 1999, 2001 Free Software Foundation, Inc.
3
   Written by Stu Grossman, Cygnus Support.
4
   Converted to back-end form by Ian Lance Taylor, Cygnus Support
5
 
6
This file is part of BFD, the Binary File Descriptor library.
7
 
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
 
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software
20
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
/* This file can only be compiled on systems which use Irix style core
23
   files (namely, Irix 4 and Irix 5, so far).  */
24
 
25
#include "bfd.h"
26
#include "sysdep.h"
27
#include "libbfd.h"
28
 
29
#ifdef IRIX_CORE
30
 
31
#include <core.out.h>
32
 
33
struct sgi_core_struct
34
{
35
  int sig;
36
  char cmd[CORE_NAMESIZE];
37
};
38
 
39
#define core_hdr(bfd) ((bfd)->tdata.sgi_core_data)
40
#define core_signal(bfd) (core_hdr(bfd)->sig)
41
#define core_command(bfd) (core_hdr(bfd)->cmd)
42
 
43
static asection *make_bfd_asection
44
  PARAMS ((bfd *, CONST char *, flagword, bfd_size_type, bfd_vma, file_ptr));
45
static const bfd_target *irix_core_core_file_p PARAMS ((bfd *));
46
static char *irix_core_core_file_failing_command PARAMS ((bfd *));
47
static int irix_core_core_file_failing_signal PARAMS ((bfd *));
48
static boolean irix_core_core_file_matches_executable_p
49
  PARAMS ((bfd *, bfd *));
50
static asymbol *irix_core_make_empty_symbol PARAMS ((bfd *));
51
static void swap_abort PARAMS ((void));
52
 
53
static asection *
54
make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
55
     bfd *abfd;
56
     CONST char *name;
57
     flagword flags;
58
     bfd_size_type _raw_size;
59
     bfd_vma vma;
60
     file_ptr filepos;
61
{
62
  asection *asect;
63
 
64
  asect = bfd_make_section_anyway (abfd, name);
65
  if (!asect)
66
    return NULL;
67
 
68
  asect->flags = flags;
69
  asect->_raw_size = _raw_size;
70
  asect->vma = vma;
71
  asect->filepos = filepos;
72
  asect->alignment_power = 4;
73
 
74
  return asect;
75
}
76
 
77
static const bfd_target *
78
irix_core_core_file_p (abfd)
79
     bfd *abfd;
80
{
81
  int val;
82
  int i;
83
  char *secname;
84
  struct coreout coreout;
85
  struct idesc *idg, *idf, *ids;
86
 
87
  val = bfd_read ((PTR)&coreout, 1, sizeof coreout, abfd);
88
  if (val != sizeof coreout)
89
    {
90
      if (bfd_get_error () != bfd_error_system_call)
91
        bfd_set_error (bfd_error_wrong_format);
92
      return 0;
93
    }
94
 
95
#ifndef CORE_MAGICN32
96
#define CORE_MAGICN32 CORE_MAGIC
97
#endif
98
  if ((coreout.c_magic != CORE_MAGIC && coreout.c_magic != CORE_MAGICN32)
99
      || coreout.c_version != CORE_VERSION1)
100
    return 0;
101
 
102
  core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, sizeof (struct sgi_core_struct));
103
  if (!core_hdr (abfd))
104
    return NULL;
105
 
106
  strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE);
107
  core_signal (abfd) = coreout.c_sigcause;
108
 
109
  if (bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET) != 0)
110
    return NULL;
111
 
112
  for (i = 0; i < coreout.c_nvmap; i++)
113
    {
114
      struct vmap vmap;
115
 
116
      val = bfd_read ((PTR)&vmap, 1, sizeof vmap, abfd);
117
      if (val != sizeof vmap)
118
        break;
119
 
120
      switch (vmap.v_type)
121
        {
122
        case VDATA:
123
          secname = ".data";
124
          break;
125
        case VSTACK:
126
          secname = ".stack";
127
          break;
128
#ifdef VMAPFILE
129
        case VMAPFILE:
130
          secname = ".mapfile";
131
          break;
132
#endif
133
        default:
134
          continue;
135
        }
136
 
137
      /* A file offset of zero means that the section is not contained
138
         in the corefile.  */
139
      if (vmap.v_offset == 0)
140
        continue;
141
 
142
      if (!make_bfd_asection (abfd, secname,
143
                              SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
144
                              vmap.v_len,
145
                              vmap.v_vaddr,
146
                              vmap.v_offset))
147
        return NULL;
148
    }
149
 
150
  /* Make sure that the regs are contiguous within the core file. */
151
 
152
  idg = &coreout.c_idesc[I_GPREGS];
153
  idf = &coreout.c_idesc[I_FPREGS];
154
  ids = &coreout.c_idesc[I_SPECREGS];
155
 
156
  if (idg->i_offset + idg->i_len != idf->i_offset
157
      || idf->i_offset + idf->i_len != ids->i_offset)
158
    return 0;                    /* Can't deal with non-contig regs */
159
 
160
  if (bfd_seek (abfd, idg->i_offset, SEEK_SET) != 0)
161
    return NULL;
162
 
163
  make_bfd_asection (abfd, ".reg",
164
                     SEC_HAS_CONTENTS,
165
                     idg->i_len + idf->i_len + ids->i_len,
166
                     0,
167
                     idg->i_offset);
168
 
169
  /* OK, we believe you.  You're a core file (sure, sure).  */
170
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, 0);
171
 
172
  return abfd->xvec;
173
}
174
 
175
static char *
176
irix_core_core_file_failing_command (abfd)
177
     bfd *abfd;
178
{
179
  return core_command (abfd);
180
}
181
 
182
static int
183
irix_core_core_file_failing_signal (abfd)
184
     bfd *abfd;
185
{
186
  return core_signal (abfd);
187
}
188
 
189
static boolean
190
irix_core_core_file_matches_executable_p (core_bfd, exec_bfd)
191
     bfd *core_bfd, *exec_bfd;
192
{
193
  return true;                  /* XXX - FIXME */
194
}
195
 
196
static asymbol *
197
irix_core_make_empty_symbol (abfd)
198
     bfd *abfd;
199
{
200
  asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol));
201
  if (new)
202
    new->the_bfd = abfd;
203
  return new;
204
}
205
 
206
#define irix_core_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
207
#define irix_core_get_symtab _bfd_nosymbols_get_symtab
208
#define irix_core_print_symbol _bfd_nosymbols_print_symbol
209
#define irix_core_get_symbol_info _bfd_nosymbols_get_symbol_info
210
#define irix_core_bfd_is_local_label_name \
211
  _bfd_nosymbols_bfd_is_local_label_name
212
#define irix_core_get_lineno _bfd_nosymbols_get_lineno
213
#define irix_core_find_nearest_line _bfd_nosymbols_find_nearest_line
214
#define irix_core_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
215
#define irix_core_read_minisymbols _bfd_nosymbols_read_minisymbols
216
#define irix_core_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol
217
 
218
/* If somebody calls any byte-swapping routines, shoot them.  */
219
static void
220
swap_abort()
221
{
222
  abort(); /* This way doesn't require any declaration for ANSI to fuck up */
223
}
224
#define NO_GET  ((bfd_vma (*) PARAMS ((   const bfd_byte *))) swap_abort )
225
#define NO_PUT  ((void    (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
226
#define NO_SIGNED_GET \
227
  ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
228
 
229
const bfd_target irix_core_vec =
230
  {
231
    "irix-core",
232
    bfd_target_unknown_flavour,
233
    BFD_ENDIAN_BIG,             /* target byte order */
234
    BFD_ENDIAN_BIG,             /* target headers byte order */
235
    (HAS_RELOC | EXEC_P |       /* object flags */
236
     HAS_LINENO | HAS_DEBUG |
237
     HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
238
    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
239
    0,                                                      /* symbol prefix */
240
    ' ',                                                   /* ar_pad_char */
241
    16,                                                    /* ar_max_namelen */
242
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit data */
243
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit data */
244
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit data */
245
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 64 bit hdrs */
246
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 32 bit hdrs */
247
    NO_GET, NO_SIGNED_GET, NO_PUT,      /* 16 bit hdrs */
248
 
249
    {                           /* bfd_check_format */
250
     _bfd_dummy_target,         /* unknown format */
251
     _bfd_dummy_target,         /* object file */
252
     _bfd_dummy_target,         /* archive */
253
     irix_core_core_file_p      /* a core file */
254
    },
255
    {                           /* bfd_set_format */
256
     bfd_false, bfd_false,
257
     bfd_false, bfd_false
258
    },
259
    {                           /* bfd_write_contents */
260
     bfd_false, bfd_false,
261
     bfd_false, bfd_false
262
    },
263
 
264
       BFD_JUMP_TABLE_GENERIC (_bfd_generic),
265
       BFD_JUMP_TABLE_COPY (_bfd_generic),
266
       BFD_JUMP_TABLE_CORE (irix_core),
267
       BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
268
       BFD_JUMP_TABLE_SYMBOLS (irix_core),
269
       BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
270
       BFD_JUMP_TABLE_WRITE (_bfd_generic),
271
       BFD_JUMP_TABLE_LINK (_bfd_nolink),
272
       BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
273
 
274
    NULL,
275
 
276
    (PTR) 0                      /* backend_data */
277
};
278
 
279
#endif /* IRIX_CORE */

powered by: WebSVN 2.1.0

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