source: trunk/binutils/bfd/netbsd-core.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.9 KB
Line 
1/* BFD back end for NetBSD style core files
2 Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
3 2002
4 Free Software Foundation, Inc.
5 Written by Paul Kranenburg, EUR
6
7This file is part of BFD, the Binary File Descriptor library.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "libbfd.h"
26#include "libaout.h" /* BFD a.out internal data structures */
27
28#include <sys/param.h>
29#include <sys/dir.h>
30#include <signal.h>
31#include <sys/core.h>
32
33/*
34 * FIXME: On NetBSD/sparc CORE_FPU_OFFSET should be (sizeof (struct trapframe))
35 */
36
37struct netbsd_core_struct {
38 struct core core;
39} *rawptr;
40
41/* forward declarations */
42
43static const bfd_target *netbsd_core_file_p
44 PARAMS ((bfd *abfd));
45static char *netbsd_core_file_failing_command
46 PARAMS ((bfd *abfd));
47static int netbsd_core_file_failing_signal
48 PARAMS ((bfd *abfd));
49static bfd_boolean netbsd_core_file_matches_executable_p
50 PARAMS ((bfd *core_bfd, bfd *exec_bfd));
51static void swap_abort
52 PARAMS ((void));
53
54/* Handle NetBSD-style core dump file. */
55
56/* ARGSUSED */
57static const bfd_target *
58netbsd_core_file_p (abfd)
59 bfd *abfd;
60
61{
62 int i, val;
63 file_ptr offset;
64 asection *asect, *asect2;
65 struct core core;
66 struct coreseg coreseg;
67 bfd_size_type amt = sizeof core;
68
69 val = bfd_bread ((void *) &core, amt, abfd);
70 if (val != sizeof core)
71 {
72 /* Too small to be a core file */
73 bfd_set_error (bfd_error_wrong_format);
74 return 0;
75 }
76
77 if (CORE_GETMAGIC (core) != COREMAGIC)
78 {
79 bfd_set_error (bfd_error_wrong_format);
80 return 0;
81 }
82
83 amt = sizeof (struct netbsd_core_struct);
84 rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
85 if (rawptr == NULL)
86 return 0;
87
88 rawptr->core = core;
89 abfd->tdata.netbsd_core_data = rawptr;
90
91 offset = core.c_hdrsize;
92 for (i = 0; i < core.c_nseg; i++)
93 {
94 const char *sname;
95 flagword flags;
96
97 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
98 goto punt;
99
100 val = bfd_bread ((void *) &coreseg, (bfd_size_type) sizeof coreseg, abfd);
101 if (val != sizeof coreseg)
102 {
103 bfd_set_error (bfd_error_file_truncated);
104 goto punt;
105 }
106 if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
107 {
108 bfd_set_error (bfd_error_wrong_format);
109 goto punt;
110 }
111
112 offset += core.c_seghdrsize;
113
114 switch (CORE_GETFLAG (coreseg))
115 {
116 case CORE_CPU:
117 sname = ".reg";
118 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
119 break;
120 case CORE_DATA:
121 sname = ".data";
122 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
123 break;
124 case CORE_STACK:
125 sname = ".stack";
126 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
127 break;
128 default:
129 sname = ".unknown";
130 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
131 break;
132 }
133 asect = bfd_make_section_anyway (abfd, sname);
134 if (asect == NULL)
135 goto punt;
136
137 asect->flags = flags;
138 asect->_raw_size = coreseg.c_size;
139 asect->vma = coreseg.c_addr;
140 asect->filepos = offset;
141 asect->alignment_power = 2;
142
143 offset += coreseg.c_size;
144
145#ifdef CORE_FPU_OFFSET
146 switch (CORE_GETFLAG (coreseg))
147 {
148 case CORE_CPU:
149 /* Hackish... */
150 asect->_raw_size = CORE_FPU_OFFSET;
151 asect2 = bfd_make_section_anyway (abfd, ".reg2");
152 if (asect2 == NULL)
153 goto punt;
154 asect2->_raw_size = coreseg.c_size - CORE_FPU_OFFSET;
155 asect2->vma = 0;
156 asect2->filepos = asect->filepos + CORE_FPU_OFFSET;
157 asect2->alignment_power = 2;
158 asect2->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
159 break;
160 }
161#endif
162 }
163
164 /* OK, we believe you. You're a core file (sure, sure). */
165 return abfd->xvec;
166
167 punt:
168 bfd_release (abfd, abfd->tdata.any);
169 abfd->tdata.any = NULL;
170 bfd_section_list_clear (abfd);
171 return 0;
172}
173
174static char*
175netbsd_core_file_failing_command (abfd)
176 bfd *abfd;
177{
178 /*return core_command (abfd);*/
179 return abfd->tdata.netbsd_core_data->core.c_name;
180}
181
182/* ARGSUSED */
183static int
184netbsd_core_file_failing_signal (abfd)
185 bfd *abfd;
186{
187 /*return core_signal (abfd);*/
188 return abfd->tdata.netbsd_core_data->core.c_signo;
189}
190
191/* ARGSUSED */
192static bfd_boolean
193netbsd_core_file_matches_executable_p (core_bfd, exec_bfd)
194 bfd *core_bfd ATTRIBUTE_UNUSED;
195 bfd *exec_bfd ATTRIBUTE_UNUSED;
196{
197 return TRUE; /* FIXME, We have no way of telling at this point */
198}
199
200
201/* If somebody calls any byte-swapping routines, shoot them. */
202static void
203swap_abort ()
204{
205 abort (); /* This way doesn't require any declaration for ANSI to fuck up */
206}
207#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort )
208#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
209#define NO_SIGNED_GET \
210 ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
211
212const bfd_target netbsd_core_vec =
213 {
214 "netbsd-core",
215 bfd_target_unknown_flavour,
216 BFD_ENDIAN_UNKNOWN, /* target byte order */
217 BFD_ENDIAN_UNKNOWN, /* target headers byte order */
218 (HAS_RELOC | EXEC_P | /* object flags */
219 HAS_LINENO | HAS_DEBUG |
220 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
221 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
222 0, /* symbol prefix */
223 ' ', /* ar_pad_char */
224 16, /* ar_max_namelen */
225 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */
226 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */
227 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */
228 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */
229 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */
230 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */
231
232 { /* bfd_check_format */
233 _bfd_dummy_target, /* unknown format */
234 _bfd_dummy_target, /* object file */
235 _bfd_dummy_target, /* archive */
236 netbsd_core_file_p /* a core file */
237 },
238 { /* bfd_set_format */
239 bfd_false, bfd_false,
240 bfd_false, bfd_false
241 },
242 { /* bfd_write_contents */
243 bfd_false, bfd_false,
244 bfd_false, bfd_false
245 },
246
247 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
248 BFD_JUMP_TABLE_COPY (_bfd_generic),
249 BFD_JUMP_TABLE_CORE (netbsd),
250 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
251 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
252 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
253 BFD_JUMP_TABLE_WRITE (_bfd_generic),
254 BFD_JUMP_TABLE_LINK (_bfd_nolink),
255 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
256
257 NULL,
258
259 (PTR) 0 /* backend_data */
260};
Note: See TracBrowser for help on using the repository browser.