* gas/i386/padlock.s: Pad with .p2align.
[deliverable/binutils-gdb.git] / bfd / irix-core.c
CommitLineData
252b5132 1/* BFD back-end for Irix core files.
9e7b37b3
AM
2 Copyright 1993, 1994, 1996, 1999, 2001, 2002
3 Free Software Foundation, Inc.
252b5132
RH
4 Written by Stu Grossman, Cygnus Support.
5 Converted to back-end form by Ian Lance Taylor, Cygnus Support
6
b3018b5f 7 This file is part of BFD, the Binary File Descriptor library.
252b5132 8
b3018b5f
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
b3018b5f
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
b3018b5f
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/* This file can only be compiled on systems which use Irix style core
24 files (namely, Irix 4 and Irix 5, so far). */
25
26#include "bfd.h"
27#include "sysdep.h"
28#include "libbfd.h"
29
30#ifdef IRIX_CORE
31
32#include <core.out.h>
33
dc810e39 34struct sgi_core_struct
252b5132
RH
35{
36 int sig;
37 char cmd[CORE_NAMESIZE];
38};
39
40#define core_hdr(bfd) ((bfd)->tdata.sgi_core_data)
41#define core_signal(bfd) (core_hdr(bfd)->sig)
42#define core_command(bfd) (core_hdr(bfd)->cmd)
43
44static asection *make_bfd_asection
dc810e39 45 PARAMS ((bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr));
b34976b6
AM
46static const bfd_target *irix_core_core_file_p
47 PARAMS ((bfd *));
48static char *irix_core_core_file_failing_command
49 PARAMS ((bfd *));
50static int irix_core_core_file_failing_signal
51 PARAMS ((bfd *));
52static bfd_boolean irix_core_core_file_matches_executable_p
252b5132 53 PARAMS ((bfd *, bfd *));
b34976b6
AM
54static void swap_abort
55 PARAMS ((void));
b3018b5f 56#ifdef CORE_MAGIC64
b34976b6
AM
57static int do_sections64
58 PARAMS ((bfd *, struct coreout *));
b3018b5f 59#endif
b34976b6
AM
60static int do_sections
61 PARAMS ((bfd *, struct coreout *));
b3018b5f
NC
62
63/* Helper function for irix_core_core_file_p:
64 32-bit and 64-bit versions. */
65
66#ifdef CORE_MAGIC64
67static int
68do_sections64 (abfd, coreout)
69 bfd * abfd;
70 struct coreout * coreout;
71{
72 struct vmap64 vmap;
73 char *secname;
74 int i, val;
75
76 for (i = 0; i < coreout->c_nvmap; i++)
77 {
78 val = bfd_bread ((PTR) &vmap, (bfd_size_type) sizeof vmap, abfd);
79 if (val != sizeof vmap)
80 break;
81
82 switch (vmap.v_type)
83 {
84 case VDATA:
85 secname = ".data";
86 break;
87 case VSTACK:
88 secname = ".stack";
89 break;
90#ifdef VMAPFILE
91 case VMAPFILE:
92 secname = ".mapfile";
93 break;
94#endif
95 default:
96 continue;
97 }
98
99 /* A file offset of zero means that the
100 section is not contained in the corefile. */
101 if (vmap.v_offset == 0)
102 continue;
103
104 if (!make_bfd_asection (abfd, secname,
105 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
106 vmap.v_len, vmap.v_vaddr, vmap.v_offset))
107 /* Fail. */
108 return 0;
109 }
110
111 return 1;
112}
113#endif
114
115/* 32-bit version. */
116
117static int
118do_sections (abfd, coreout)
119 bfd * abfd;
120 struct coreout *coreout;
121{
122 struct vmap vmap;
123 char *secname;
124 int i, val;
125
126 for (i = 0; i < coreout->c_nvmap; i++)
127 {
128 val = bfd_bread ((PTR) &vmap, (bfd_size_type) sizeof vmap, abfd);
129 if (val != sizeof vmap)
130 break;
131
132 switch (vmap.v_type)
133 {
134 case VDATA:
135 secname = ".data";
136 break;
137 case VSTACK:
138 secname = ".stack";
139 break;
140#ifdef VMAPFILE
141 case VMAPFILE:
142 secname = ".mapfile";
143 break;
144#endif
145 default:
146 continue;
147 }
148
149 /* A file offset of zero means that the
150 section is not contained in the corefile. */
151 if (vmap.v_offset == 0)
152 continue;
153
154 if (!make_bfd_asection (abfd, secname,
155 SEC_ALLOC | SEC_LOAD+SEC_HAS_CONTENTS,
156 vmap.v_len, vmap.v_vaddr, vmap.v_offset))
157 /* Fail. */
158 return 0;
159 }
160 return 1;
161}
252b5132
RH
162
163static asection *
164make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
165 bfd *abfd;
dc810e39 166 const char *name;
252b5132
RH
167 flagword flags;
168 bfd_size_type _raw_size;
169 bfd_vma vma;
170 file_ptr filepos;
171{
172 asection *asect;
173
174 asect = bfd_make_section_anyway (abfd, name);
175 if (!asect)
176 return NULL;
177
178 asect->flags = flags;
179 asect->_raw_size = _raw_size;
180 asect->vma = vma;
181 asect->filepos = filepos;
182 asect->alignment_power = 4;
183
184 return asect;
185}
186
187static const bfd_target *
188irix_core_core_file_p (abfd)
189 bfd *abfd;
190{
191 int val;
252b5132
RH
192 struct coreout coreout;
193 struct idesc *idg, *idf, *ids;
dc810e39 194 bfd_size_type amt;
252b5132 195
dc810e39 196 val = bfd_bread ((PTR) &coreout, (bfd_size_type) sizeof coreout, abfd);
252b5132
RH
197 if (val != sizeof coreout)
198 {
199 if (bfd_get_error () != bfd_error_system_call)
200 bfd_set_error (bfd_error_wrong_format);
201 return 0;
202 }
203
b3018b5f 204 if (coreout.c_version != CORE_VERSION1)
252b5132
RH
205 return 0;
206
b3018b5f
NC
207 /* Have we got a corefile? */
208 switch (coreout.c_magic)
209 {
210 case CORE_MAGIC: break;
211#ifdef CORE_MAGIC64
212 case CORE_MAGIC64: break;
213#endif
214#ifdef CORE_MAGICN32
215 case CORE_MAGICN32: break;
216#endif
217 default: return 0; /* Un-identifiable or not corefile. */
218 }
219
dc810e39
AM
220 amt = sizeof (struct sgi_core_struct);
221 core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, amt);
252b5132
RH
222 if (!core_hdr (abfd))
223 return NULL;
224
225 strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE);
226 core_signal (abfd) = coreout.c_sigcause;
227
228 if (bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET) != 0)
9e7b37b3 229 goto fail;
252b5132 230
b3018b5f
NC
231 /* Process corefile sections. */
232#ifdef CORE_MAGIC64
233 if (coreout.c_magic == (int) CORE_MAGIC64)
252b5132 234 {
b3018b5f 235 if (! do_sections64 (abfd, & coreout))
9e7b37b3 236 goto fail;
252b5132 237 }
b3018b5f
NC
238 else
239#endif
240 if (! do_sections (abfd, & coreout))
241 goto fail;
252b5132 242
b3018b5f 243 /* Make sure that the regs are contiguous within the core file. */
252b5132
RH
244
245 idg = &coreout.c_idesc[I_GPREGS];
246 idf = &coreout.c_idesc[I_FPREGS];
247 ids = &coreout.c_idesc[I_SPECREGS];
248
249 if (idg->i_offset + idg->i_len != idf->i_offset
250 || idf->i_offset + idf->i_len != ids->i_offset)
9e7b37b3 251 goto fail; /* Can't deal with non-contig regs */
252b5132
RH
252
253 if (bfd_seek (abfd, idg->i_offset, SEEK_SET) != 0)
9e7b37b3 254 goto fail;
252b5132 255
9e7b37b3
AM
256 if (!make_bfd_asection (abfd, ".reg",
257 SEC_HAS_CONTENTS,
258 idg->i_len + idf->i_len + ids->i_len,
259 0,
260 idg->i_offset))
261 goto fail;
dc810e39 262
252b5132 263 /* OK, we believe you. You're a core file (sure, sure). */
dc3febfa 264 bfd_default_set_arch_mach (abfd, bfd_arch_mips, 0);
252b5132
RH
265
266 return abfd->xvec;
9e7b37b3
AM
267
268 fail:
269 bfd_release (abfd, core_hdr (abfd));
270 core_hdr (abfd) = NULL;
271 bfd_section_list_clear (abfd);
272 return NULL;
252b5132
RH
273}
274
275static char *
276irix_core_core_file_failing_command (abfd)
277 bfd *abfd;
278{
279 return core_command (abfd);
280}
281
282static int
283irix_core_core_file_failing_signal (abfd)
284 bfd *abfd;
285{
286 return core_signal (abfd);
287}
288
b34976b6 289static bfd_boolean
252b5132
RH
290irix_core_core_file_matches_executable_p (core_bfd, exec_bfd)
291 bfd *core_bfd, *exec_bfd;
292{
b34976b6 293 return TRUE; /* XXX - FIXME */
252b5132
RH
294}
295
252b5132
RH
296/* If somebody calls any byte-swapping routines, shoot them. */
297static void
298swap_abort()
299{
300 abort(); /* This way doesn't require any declaration for ANSI to fuck up */
301}
302#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort )
303#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
304#define NO_SIGNED_GET \
305 ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
306
307const bfd_target irix_core_vec =
308 {
309 "irix-core",
310 bfd_target_unknown_flavour,
311 BFD_ENDIAN_BIG, /* target byte order */
312 BFD_ENDIAN_BIG, /* target headers byte order */
313 (HAS_RELOC | EXEC_P | /* object flags */
314 HAS_LINENO | HAS_DEBUG |
315 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
316 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
317 0, /* symbol prefix */
318 ' ', /* ar_pad_char */
319 16, /* ar_max_namelen */
320 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */
321 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */
322 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */
323 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */
324 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */
325 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */
326
327 { /* bfd_check_format */
328 _bfd_dummy_target, /* unknown format */
329 _bfd_dummy_target, /* object file */
330 _bfd_dummy_target, /* archive */
331 irix_core_core_file_p /* a core file */
332 },
333 { /* bfd_set_format */
334 bfd_false, bfd_false,
335 bfd_false, bfd_false
336 },
337 { /* bfd_write_contents */
338 bfd_false, bfd_false,
339 bfd_false, bfd_false
340 },
dc810e39 341
3f3c5c34
AM
342 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
343 BFD_JUMP_TABLE_COPY (_bfd_generic),
344 BFD_JUMP_TABLE_CORE (irix_core),
345 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
346 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
347 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
348 BFD_JUMP_TABLE_WRITE (_bfd_generic),
349 BFD_JUMP_TABLE_LINK (_bfd_nolink),
350 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 351
c3c89269 352 NULL,
dc810e39 353
252b5132
RH
354 (PTR) 0 /* backend_data */
355};
356
357#endif /* IRIX_CORE */
This page took 0.343809 seconds and 4 git commands to generate.