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