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