* NEWS (New native configurations): Mention OpenBSD/vax.
[deliverable/binutils-gdb.git] / bfd / netbsd-core.c
CommitLineData
252b5132 1/* BFD back end for NetBSD style core files
9e7b37b3 2 Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
edeb6e24 3 2002, 2003, 2004
7898deda 4 Free Software Foundation, Inc.
252b5132
RH
5 Written by Paul Kranenburg, EUR
6
aca305d9 7 This file is part of BFD, the Binary File Descriptor library.
252b5132 8
aca305d9
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
252b5132 13
aca305d9
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
252b5132 18
aca305d9
NC
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
252b5132
RH
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "libbfd.h"
aca305d9 26#include "libaout.h" /* BFD a.out internal data structures. */
252b5132
RH
27
28#include <sys/param.h>
29#include <sys/dir.h>
30#include <signal.h>
31#include <sys/core.h>
32
aca305d9
NC
33/* The machine ID for OpenBSD/sparc64 and older versions of
34 NetBSD/sparc64 overlaps with M_MIPS1. */
35#define M_SPARC64_OPENBSD M_MIPS1
252b5132 36
24d18d30
MK
37/* Offset of StackGhost cookie within `struct md_coredump' on
38 OpenBSD/sparc. */
39#define CORE_WCOOKIE_OFFSET 344
40
aca305d9
NC
41struct netbsd_core_struct
42{
43 struct core core;
252b5132
RH
44} *rawptr;
45
aca305d9 46/* Forward declarations. */
252b5132 47
b34976b6
AM
48static const bfd_target *netbsd_core_file_p
49 PARAMS ((bfd *abfd));
50static char *netbsd_core_file_failing_command
51 PARAMS ((bfd *abfd));
52static int netbsd_core_file_failing_signal
53 PARAMS ((bfd *abfd));
54static bfd_boolean netbsd_core_file_matches_executable_p
dc810e39 55 PARAMS ((bfd *core_bfd, bfd *exec_bfd));
b34976b6
AM
56static void swap_abort
57 PARAMS ((void));
252b5132
RH
58
59/* Handle NetBSD-style core dump file. */
60
252b5132
RH
61static const bfd_target *
62netbsd_core_file_p (abfd)
63 bfd *abfd;
64
65{
dc810e39
AM
66 int i, val;
67 file_ptr offset;
021d7868 68 asection *asect;
dc810e39
AM
69 struct core core;
70 struct coreseg coreseg;
71 bfd_size_type amt = sizeof core;
72
73 val = bfd_bread ((void *) &core, amt, abfd);
74 if (val != sizeof core)
75 {
aca305d9 76 /* Too small to be a core file. */
dc810e39
AM
77 bfd_set_error (bfd_error_wrong_format);
78 return 0;
79 }
80
81 if (CORE_GETMAGIC (core) != COREMAGIC)
82 {
83 bfd_set_error (bfd_error_wrong_format);
84 return 0;
85 }
86
87 amt = sizeof (struct netbsd_core_struct);
88 rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
89 if (rawptr == NULL)
9e7b37b3 90 return 0;
dc810e39
AM
91
92 rawptr->core = core;
93 abfd->tdata.netbsd_core_data = rawptr;
94
95 offset = core.c_hdrsize;
96 for (i = 0; i < core.c_nseg; i++)
97 {
9e7b37b3
AM
98 const char *sname;
99 flagword flags;
dc810e39
AM
100
101 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
102 goto punt;
103
104 val = bfd_bread ((void *) &coreseg, (bfd_size_type) sizeof coreseg, abfd);
105 if (val != sizeof coreseg)
106 {
107 bfd_set_error (bfd_error_file_truncated);
108 goto punt;
252b5132 109 }
dc810e39
AM
110 if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
111 {
112 bfd_set_error (bfd_error_wrong_format);
113 goto punt;
252b5132
RH
114 }
115
dc810e39
AM
116 offset += core.c_seghdrsize;
117
9e7b37b3 118 switch (CORE_GETFLAG (coreseg))
dc810e39 119 {
9e7b37b3
AM
120 case CORE_CPU:
121 sname = ".reg";
122 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
123 break;
124 case CORE_DATA:
125 sname = ".data";
126 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
127 break;
128 case CORE_STACK:
129 sname = ".stack";
130 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
131 break;
132 default:
133 sname = ".unknown";
134 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
135 break;
252b5132 136 }
9e7b37b3
AM
137 asect = bfd_make_section_anyway (abfd, sname);
138 if (asect == NULL)
139 goto punt;
252b5132 140
9e7b37b3 141 asect->flags = flags;
dc810e39
AM
142 asect->_raw_size = coreseg.c_size;
143 asect->vma = coreseg.c_addr;
144 asect->filepos = offset;
145 asect->alignment_power = 2;
9e7b37b3 146
24d18d30
MK
147 if (CORE_GETMID (core) == M_SPARC_NETBSD
148 && CORE_GETFLAG (coreseg) == CORE_CPU
149 && coreseg.c_size > CORE_WCOOKIE_OFFSET)
150 {
151 /* Truncate the .reg section. */
152 asect->_raw_size = CORE_WCOOKIE_OFFSET;
153
154 /* And create the .wcookie section. */
155 asect = bfd_make_section_anyway (abfd, ".wcookie");
156 if (asect == NULL)
157 goto punt;
158
159 asect->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
160 asect->_raw_size = 4;
161 asect->vma = 0;
162 asect->filepos = offset + CORE_WCOOKIE_OFFSET;
163 asect->alignment_power = 2;
164 }
165
dc810e39 166 offset += coreseg.c_size;
dc810e39
AM
167 }
168
aca305d9
NC
169 /* Set architecture from machine ID. */
170 switch (CORE_GETMID (core))
171 {
172 case M_X86_64_NETBSD:
173 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
174 break;
175
176 case M_386_NETBSD:
177 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
178 break;
179
180 case M_SPARC_NETBSD:
181 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
182 break;
183
184 case M_SPARC64_NETBSD:
185 case M_SPARC64_OPENBSD:
186 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
187 break;
188 }
189
dc810e39
AM
190 /* OK, we believe you. You're a core file (sure, sure). */
191 return abfd->xvec;
192
193 punt:
9e7b37b3
AM
194 bfd_release (abfd, abfd->tdata.any);
195 abfd->tdata.any = NULL;
196 bfd_section_list_clear (abfd);
dc810e39 197 return 0;
252b5132
RH
198}
199
200static char*
201netbsd_core_file_failing_command (abfd)
202 bfd *abfd;
203{
204 /*return core_command (abfd);*/
205 return abfd->tdata.netbsd_core_data->core.c_name;
206}
207
252b5132
RH
208static int
209netbsd_core_file_failing_signal (abfd)
210 bfd *abfd;
211{
212 /*return core_signal (abfd);*/
213 return abfd->tdata.netbsd_core_data->core.c_signo;
214}
215
b34976b6 216static bfd_boolean
252b5132 217netbsd_core_file_matches_executable_p (core_bfd, exec_bfd)
dc810e39
AM
218 bfd *core_bfd ATTRIBUTE_UNUSED;
219 bfd *exec_bfd ATTRIBUTE_UNUSED;
252b5132 220{
aca305d9
NC
221 /* FIXME, We have no way of telling at this point. */
222 return TRUE;
252b5132
RH
223}
224\f
225/* If somebody calls any byte-swapping routines, shoot them. */
aca305d9 226
252b5132 227static void
1518639e 228swap_abort ()
252b5132 229{
aca305d9
NC
230 /* This way doesn't require any declaration for ANSI to fuck up. */
231 abort ();
252b5132 232}
aca305d9 233
edeb6e24
AM
234#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
235#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
236#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
237#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
238#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
239#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132
RH
240
241const bfd_target netbsd_core_vec =
242 {
243 "netbsd-core",
244 bfd_target_unknown_flavour,
aca305d9
NC
245 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
246 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
247 (HAS_RELOC | EXEC_P | /* Object flags. */
252b5132
RH
248 HAS_LINENO | HAS_DEBUG |
249 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
aca305d9
NC
250 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
251 0, /* Symbol prefix. */
252 ' ', /* ar_pad_char. */
253 16, /* ar_max_namelen. */
8ce8c090 254 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data. */
edeb6e24
AM
255 NO_GET, NO_GETS, NO_PUT, /* 32 bit data. */
256 NO_GET, NO_GETS, NO_PUT, /* 16 bit data. */
8ce8c090 257 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs. */
edeb6e24
AM
258 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs. */
259 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs. */
260
8ce8c090
AM
261 { /* bfd_check_format. */
262 _bfd_dummy_target, /* Unknown format. */
263 _bfd_dummy_target, /* Object file. */
264 _bfd_dummy_target, /* Archive. */
265 netbsd_core_file_p /* A core file. */
252b5132 266 },
aca305d9 267 { /* bfd_set_format. */
8ce8c090
AM
268 bfd_false, bfd_false,
269 bfd_false, bfd_false
252b5132 270 },
aca305d9 271 { /* bfd_write_contents. */
8ce8c090
AM
272 bfd_false, bfd_false,
273 bfd_false, bfd_false
252b5132 274 },
1518639e 275
8ce8c090
AM
276 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
277 BFD_JUMP_TABLE_COPY (_bfd_generic),
278 BFD_JUMP_TABLE_CORE (netbsd),
279 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
280 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
281 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
282 BFD_JUMP_TABLE_WRITE (_bfd_generic),
283 BFD_JUMP_TABLE_LINK (_bfd_nolink),
284 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 285
c3c89269 286 NULL,
1518639e 287
aca305d9 288 (PTR) 0 /* Backend_data. */
8ce8c090 289 };
This page took 0.25122 seconds and 4 git commands to generate.