* coffcode.h (coff_write_object_contents) [COFF_IMAGE_WITH_PE]:
[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
0b60d5d3
MK
180 case M_POWERPC_NETBSD:
181 bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
182 break;
183
aca305d9
NC
184 case M_SPARC_NETBSD:
185 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
186 break;
187
188 case M_SPARC64_NETBSD:
189 case M_SPARC64_OPENBSD:
190 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
191 break;
d1ad3f6f
MK
192
193 case M_VAX_NETBSD:
194 case M_VAX4K_NETBSD:
195 bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
196 break;
aca305d9 197 }
d1ad3f6f 198
dc810e39
AM
199 /* OK, we believe you. You're a core file (sure, sure). */
200 return abfd->xvec;
201
202 punt:
9e7b37b3
AM
203 bfd_release (abfd, abfd->tdata.any);
204 abfd->tdata.any = NULL;
205 bfd_section_list_clear (abfd);
dc810e39 206 return 0;
252b5132
RH
207}
208
209static char*
210netbsd_core_file_failing_command (abfd)
211 bfd *abfd;
212{
213 /*return core_command (abfd);*/
214 return abfd->tdata.netbsd_core_data->core.c_name;
215}
216
252b5132
RH
217static int
218netbsd_core_file_failing_signal (abfd)
219 bfd *abfd;
220{
221 /*return core_signal (abfd);*/
222 return abfd->tdata.netbsd_core_data->core.c_signo;
223}
224
b34976b6 225static bfd_boolean
252b5132 226netbsd_core_file_matches_executable_p (core_bfd, exec_bfd)
dc810e39
AM
227 bfd *core_bfd ATTRIBUTE_UNUSED;
228 bfd *exec_bfd ATTRIBUTE_UNUSED;
252b5132 229{
aca305d9
NC
230 /* FIXME, We have no way of telling at this point. */
231 return TRUE;
252b5132
RH
232}
233\f
234/* If somebody calls any byte-swapping routines, shoot them. */
aca305d9 235
252b5132 236static void
1518639e 237swap_abort ()
252b5132 238{
aca305d9
NC
239 /* This way doesn't require any declaration for ANSI to fuck up. */
240 abort ();
252b5132 241}
aca305d9 242
edeb6e24
AM
243#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
244#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
245#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
246#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
247#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
248#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132
RH
249
250const bfd_target netbsd_core_vec =
251 {
252 "netbsd-core",
253 bfd_target_unknown_flavour,
aca305d9
NC
254 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
255 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
256 (HAS_RELOC | EXEC_P | /* Object flags. */
252b5132
RH
257 HAS_LINENO | HAS_DEBUG |
258 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
aca305d9
NC
259 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
260 0, /* Symbol prefix. */
261 ' ', /* ar_pad_char. */
262 16, /* ar_max_namelen. */
8ce8c090 263 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data. */
edeb6e24
AM
264 NO_GET, NO_GETS, NO_PUT, /* 32 bit data. */
265 NO_GET, NO_GETS, NO_PUT, /* 16 bit data. */
8ce8c090 266 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs. */
edeb6e24
AM
267 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs. */
268 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs. */
269
8ce8c090
AM
270 { /* bfd_check_format. */
271 _bfd_dummy_target, /* Unknown format. */
272 _bfd_dummy_target, /* Object file. */
273 _bfd_dummy_target, /* Archive. */
274 netbsd_core_file_p /* A core file. */
252b5132 275 },
aca305d9 276 { /* bfd_set_format. */
8ce8c090
AM
277 bfd_false, bfd_false,
278 bfd_false, bfd_false
252b5132 279 },
aca305d9 280 { /* bfd_write_contents. */
8ce8c090
AM
281 bfd_false, bfd_false,
282 bfd_false, bfd_false
252b5132 283 },
1518639e 284
8ce8c090
AM
285 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
286 BFD_JUMP_TABLE_COPY (_bfd_generic),
287 BFD_JUMP_TABLE_CORE (netbsd),
288 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
289 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
290 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
291 BFD_JUMP_TABLE_WRITE (_bfd_generic),
292 BFD_JUMP_TABLE_LINK (_bfd_nolink),
293 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 294
c3c89269 295 NULL,
1518639e 296
aca305d9 297 (PTR) 0 /* Backend_data. */
8ce8c090 298 };
This page took 0.272718 seconds and 4 git commands to generate.