]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/netbsd-core.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / netbsd-core.c
CommitLineData
252b5132 1/* BFD back end for NetBSD style core files
250d07de 2 Copyright (C) 1988-2021 Free Software Foundation, Inc.
252b5132
RH
3 Written by Paul Kranenburg, EUR
4
aca305d9 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
aca305d9
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
aca305d9 10 (at your option) any later version.
252b5132 11
aca305d9
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
aca305d9
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132 24#include "libbfd.h"
07d6d2b8 25#include "libaout.h" /* BFD a.out internal data structures. */
252b5132
RH
26
27#include <sys/param.h>
28#include <sys/dir.h>
29#include <signal.h>
30#include <sys/core.h>
31
aca305d9
NC
32/* The machine ID for OpenBSD/sparc64 and older versions of
33 NetBSD/sparc64 overlaps with M_MIPS1. */
34#define M_SPARC64_OPENBSD M_MIPS1
252b5132 35
24d18d30
MK
36/* Offset of StackGhost cookie within `struct md_coredump' on
37 OpenBSD/sparc. */
8c101720
NC
38#define SPARC_WCOOKIE_OFFSET 344
39
40/* Offset of StackGhost cookie within `struct md_coredump' on
41 OpenBSD/sparc64. */
42#define SPARC64_WCOOKIE_OFFSET 832
24d18d30 43
69d246d9 44#define netbsd_core_file_matches_executable_p generic_core_file_matches_executable_p
3b059137 45#define netbsd_core_file_pid _bfd_nocore_core_file_pid
69d246d9 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
601b73d5 54static bfd_cleanup
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;
986f0783 63 size_t amt = sizeof core;
dc810e39 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
d34436e8
MK
201 case M_HPPA_OPENBSD:
202 bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
203 break;
204
205 case M_POWERPC_NETBSD:
206 bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
207 break;
208
209 case M_SPARC_NETBSD:
210 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
211 break;
212
213 case M_SPARC64_NETBSD:
214 case M_SPARC64_OPENBSD:
215 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
216 break;
217
218 case M_VAX_NETBSD:
219 case M_VAX4K_NETBSD:
220 bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
221 break;
222 }
d1ad3f6f 223
dc810e39 224 /* OK, we believe you. You're a core file (sure, sure). */
601b73d5 225 return _bfd_no_cleanup;
dc810e39
AM
226
227 punt:
9e7b37b3
AM
228 bfd_release (abfd, abfd->tdata.any);
229 abfd->tdata.any = NULL;
230 bfd_section_list_clear (abfd);
dc810e39 231 return 0;
252b5132
RH
232}
233
234static char*
832bc186 235netbsd_core_file_failing_command (bfd *abfd)
252b5132 236{
832bc186 237 /*return core_command (abfd);*/
252b5132
RH
238 return abfd->tdata.netbsd_core_data->core.c_name;
239}
240
252b5132 241static int
832bc186 242netbsd_core_file_failing_signal (bfd *abfd)
252b5132
RH
243{
244 /*return core_signal (abfd);*/
245 return abfd->tdata.netbsd_core_data->core.c_signo;
246}
252b5132
RH
247\f
248/* If somebody calls any byte-swapping routines, shoot them. */
aca305d9 249
252b5132 250static void
832bc186 251swap_abort (void)
252b5132 252{
aca305d9
NC
253 /* This way doesn't require any declaration for ANSI to fuck up. */
254 abort ();
252b5132 255}
aca305d9 256
edeb6e24
AM
257#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
258#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
259#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
260#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
261#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
262#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132 263
6d00b590 264const bfd_target core_netbsd_vec =
252b5132
RH
265 {
266 "netbsd-core",
267 bfd_target_unknown_flavour,
aca305d9
NC
268 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
269 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
270 (HAS_RELOC | EXEC_P | /* Object flags. */
252b5132
RH
271 HAS_LINENO | HAS_DEBUG |
272 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
832bc186
MK
273 (SEC_HAS_CONTENTS | /* Section flags. */
274 SEC_ALLOC | SEC_LOAD | SEC_RELOC),
275 0, /* Symbol prefix. */
276 ' ', /* ar_pad_char. */
277 16, /* ar_max_namelen. */
9a66aae0 278 0, /* Match priority. */
8ce8c090 279 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data. */
edeb6e24
AM
280 NO_GET, NO_GETS, NO_PUT, /* 32 bit data. */
281 NO_GET, NO_GETS, NO_PUT, /* 16 bit data. */
8ce8c090 282 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs. */
edeb6e24
AM
283 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs. */
284 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs. */
285
8ce8c090
AM
286 { /* bfd_check_format. */
287 _bfd_dummy_target, /* Unknown format. */
288 _bfd_dummy_target, /* Object file. */
289 _bfd_dummy_target, /* Archive. */
290 netbsd_core_file_p /* A core file. */
252b5132 291 },
aca305d9 292 { /* bfd_set_format. */
d00dd7dc
AM
293 _bfd_bool_bfd_false_error,
294 _bfd_bool_bfd_false_error,
295 _bfd_bool_bfd_false_error,
296 _bfd_bool_bfd_false_error
252b5132 297 },
aca305d9 298 { /* bfd_write_contents. */
d00dd7dc
AM
299 _bfd_bool_bfd_false_error,
300 _bfd_bool_bfd_false_error,
301 _bfd_bool_bfd_false_error,
302 _bfd_bool_bfd_false_error
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
07d6d2b8 317 NULL /* Backend_data. */
8ce8c090 318 };