]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/netbsd-core.c
Switch sources over to use the GPL version 3
[thirdparty/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,
3db64b00 3 2002, 2003, 2004, 2005, 2006, 2007
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
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
aca305d9 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
cd123cb7
NC
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
252b5132 23
252b5132 24#include "sysdep.h"
3db64b00 25#include "bfd.h"
252b5132 26#include "libbfd.h"
aca305d9 27#include "libaout.h" /* BFD a.out internal data structures. */
252b5132
RH
28
29#include <sys/param.h>
30#include <sys/dir.h>
31#include <signal.h>
32#include <sys/core.h>
33
aca305d9
NC
34/* The machine ID for OpenBSD/sparc64 and older versions of
35 NetBSD/sparc64 overlaps with M_MIPS1. */
36#define M_SPARC64_OPENBSD M_MIPS1
252b5132 37
24d18d30
MK
38/* Offset of StackGhost cookie within `struct md_coredump' on
39 OpenBSD/sparc. */
8c101720
NC
40#define SPARC_WCOOKIE_OFFSET 344
41
42/* Offset of StackGhost cookie within `struct md_coredump' on
43 OpenBSD/sparc64. */
44#define SPARC64_WCOOKIE_OFFSET 832
24d18d30 45
69d246d9
JB
46#define netbsd_core_file_matches_executable_p generic_core_file_matches_executable_p
47
aca305d9
NC
48struct netbsd_core_struct
49{
50 struct core core;
252b5132
RH
51} *rawptr;
52
252b5132
RH
53/* Handle NetBSD-style core dump file. */
54
252b5132 55static const bfd_target *
832bc186 56netbsd_core_file_p (bfd *abfd)
252b5132 57{
45ab555d
BE
58 int val;
59 unsigned i;
dc810e39 60 file_ptr offset;
021d7868 61 asection *asect;
dc810e39
AM
62 struct core core;
63 struct coreseg coreseg;
64 bfd_size_type amt = sizeof core;
65
832bc186 66 val = bfd_bread (&core, amt, abfd);
dc810e39
AM
67 if (val != sizeof core)
68 {
aca305d9 69 /* Too small to be a core file. */
dc810e39
AM
70 bfd_set_error (bfd_error_wrong_format);
71 return 0;
72 }
73
74 if (CORE_GETMAGIC (core) != COREMAGIC)
75 {
76 bfd_set_error (bfd_error_wrong_format);
77 return 0;
78 }
79
80 amt = sizeof (struct netbsd_core_struct);
81 rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
82 if (rawptr == NULL)
9e7b37b3 83 return 0;
dc810e39
AM
84
85 rawptr->core = core;
86 abfd->tdata.netbsd_core_data = rawptr;
87
88 offset = core.c_hdrsize;
89 for (i = 0; i < core.c_nseg; i++)
90 {
9e7b37b3
AM
91 const char *sname;
92 flagword flags;
dc810e39
AM
93
94 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
95 goto punt;
96
832bc186 97 val = bfd_bread (&coreseg, sizeof coreseg, abfd);
dc810e39
AM
98 if (val != sizeof coreseg)
99 {
100 bfd_set_error (bfd_error_file_truncated);
101 goto punt;
252b5132 102 }
dc810e39
AM
103 if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
104 {
105 bfd_set_error (bfd_error_wrong_format);
106 goto punt;
252b5132
RH
107 }
108
dc810e39
AM
109 offset += core.c_seghdrsize;
110
9e7b37b3 111 switch (CORE_GETFLAG (coreseg))
dc810e39 112 {
9e7b37b3
AM
113 case CORE_CPU:
114 sname = ".reg";
115 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
116 break;
117 case CORE_DATA:
118 sname = ".data";
119 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
120 break;
121 case CORE_STACK:
122 sname = ".stack";
123 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
124 break;
125 default:
126 sname = ".unknown";
127 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
128 break;
252b5132 129 }
117ed4f8 130 asect = bfd_make_section_anyway_with_flags (abfd, sname, flags);
9e7b37b3
AM
131 if (asect == NULL)
132 goto punt;
252b5132 133
eea6121a 134 asect->size = coreseg.c_size;
dc810e39
AM
135 asect->vma = coreseg.c_addr;
136 asect->filepos = offset;
137 asect->alignment_power = 2;
9e7b37b3 138
8c101720 139 if (CORE_GETFLAG (coreseg) == CORE_CPU)
24d18d30 140 {
8c101720
NC
141 bfd_size_type wcookie_offset;
142
143 switch (CORE_GETMID (core))
144 {
145 case M_SPARC_NETBSD:
146 wcookie_offset = SPARC_WCOOKIE_OFFSET;
147 break;
148 case M_SPARC64_OPENBSD:
149 wcookie_offset = SPARC64_WCOOKIE_OFFSET;
150 break;
151 default:
152 wcookie_offset = 0;
153 break;
154 }
155
156 if (wcookie_offset > 0 && coreseg.c_size > wcookie_offset)
157 {
158 /* Truncate the .reg section. */
159 asect->size = wcookie_offset;
160
161 /* And create the .wcookie section. */
117ed4f8
AM
162 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
163 asect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
164 flags);
8c101720
NC
165 if (asect == NULL)
166 goto punt;
167
8c101720
NC
168 asect->size = coreseg.c_size - wcookie_offset;
169 asect->vma = 0;
170 asect->filepos = offset + wcookie_offset;
171 asect->alignment_power = 2;
172 }
24d18d30
MK
173 }
174
dc810e39 175 offset += coreseg.c_size;
dc810e39
AM
176 }
177
d34436e8
MK
178 /* Set architecture from machine ID. */
179 switch (CORE_GETMID (core))
180 {
181 case M_ALPHA_NETBSD:
182 bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
183 break;
184
185 case M_ARM6_NETBSD:
186 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_3);
187 break;
188
189 case M_X86_64_NETBSD:
190 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
191 break;
192
193 case M_386_NETBSD:
194 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
195 break;
196
197 case M_68K_NETBSD:
198 case M_68K4K_NETBSD:
199 bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
200 break;
201
202 case M_88K_OPENBSD:
203 bfd_default_set_arch_mach (abfd, bfd_arch_m88k, 0);
204 break;
205
206 case M_HPPA_OPENBSD:
207 bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
208 break;
209
210 case M_POWERPC_NETBSD:
211 bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
212 break;
213
214 case M_SPARC_NETBSD:
215 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
216 break;
217
218 case M_SPARC64_NETBSD:
219 case M_SPARC64_OPENBSD:
220 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
221 break;
222
223 case M_VAX_NETBSD:
224 case M_VAX4K_NETBSD:
225 bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
226 break;
227 }
d1ad3f6f 228
dc810e39
AM
229 /* OK, we believe you. You're a core file (sure, sure). */
230 return abfd->xvec;
231
232 punt:
9e7b37b3
AM
233 bfd_release (abfd, abfd->tdata.any);
234 abfd->tdata.any = NULL;
235 bfd_section_list_clear (abfd);
dc810e39 236 return 0;
252b5132
RH
237}
238
239static char*
832bc186 240netbsd_core_file_failing_command (bfd *abfd)
252b5132 241{
832bc186 242 /*return core_command (abfd);*/
252b5132
RH
243 return abfd->tdata.netbsd_core_data->core.c_name;
244}
245
252b5132 246static int
832bc186 247netbsd_core_file_failing_signal (bfd *abfd)
252b5132
RH
248{
249 /*return core_signal (abfd);*/
250 return abfd->tdata.netbsd_core_data->core.c_signo;
251}
252b5132
RH
252\f
253/* If somebody calls any byte-swapping routines, shoot them. */
aca305d9 254
252b5132 255static void
832bc186 256swap_abort (void)
252b5132 257{
aca305d9
NC
258 /* This way doesn't require any declaration for ANSI to fuck up. */
259 abort ();
252b5132 260}
aca305d9 261
edeb6e24
AM
262#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
263#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
264#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
265#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
266#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
267#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132
RH
268
269const bfd_target netbsd_core_vec =
270 {
271 "netbsd-core",
272 bfd_target_unknown_flavour,
aca305d9
NC
273 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
274 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
275 (HAS_RELOC | EXEC_P | /* Object flags. */
252b5132
RH
276 HAS_LINENO | HAS_DEBUG |
277 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
832bc186
MK
278 (SEC_HAS_CONTENTS | /* Section flags. */
279 SEC_ALLOC | SEC_LOAD | SEC_RELOC),
280 0, /* Symbol prefix. */
281 ' ', /* ar_pad_char. */
282 16, /* ar_max_namelen. */
8ce8c090 283 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data. */
edeb6e24
AM
284 NO_GET, NO_GETS, NO_PUT, /* 32 bit data. */
285 NO_GET, NO_GETS, NO_PUT, /* 16 bit data. */
8ce8c090 286 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs. */
edeb6e24
AM
287 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs. */
288 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs. */
289
8ce8c090
AM
290 { /* bfd_check_format. */
291 _bfd_dummy_target, /* Unknown format. */
292 _bfd_dummy_target, /* Object file. */
293 _bfd_dummy_target, /* Archive. */
294 netbsd_core_file_p /* A core file. */
252b5132 295 },
aca305d9 296 { /* bfd_set_format. */
8ce8c090
AM
297 bfd_false, bfd_false,
298 bfd_false, bfd_false
252b5132 299 },
aca305d9 300 { /* bfd_write_contents. */
8ce8c090
AM
301 bfd_false, bfd_false,
302 bfd_false, bfd_false
252b5132 303 },
1518639e 304
8ce8c090
AM
305 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
306 BFD_JUMP_TABLE_COPY (_bfd_generic),
307 BFD_JUMP_TABLE_CORE (netbsd),
308 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
309 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
310 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
311 BFD_JUMP_TABLE_WRITE (_bfd_generic),
312 BFD_JUMP_TABLE_LINK (_bfd_nolink),
313 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 314
c3c89269 315 NULL,
1518639e 316
aca305d9 317 (PTR) 0 /* Backend_data. */
8ce8c090 318 };