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