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