]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/osf-core.c
Switch sources over to use the GPL version 3
[thirdparty/binutils-gdb.git] / bfd / osf-core.c
CommitLineData
252b5132 1/* BFD back-end for OSF/1 core files.
3db64b00
AM
2 Copyright 1993, 1994, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2006,
3 2007 Free Software Foundation, Inc.
252b5132 4
cd123cb7 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
cd123cb7
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
252b5132 11
cd123cb7
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.
16
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
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132 21
252b5132
RH
22
23/* This file can only be compiled on systems which use OSF/1 style
24 core files. */
25
252b5132 26#include "sysdep.h"
3db64b00 27#include "bfd.h"
252b5132
RH
28#include "libbfd.h"
29
30#include <sys/user.h>
9b818146 31#ifdef OSF_CORE
252b5132 32#include <sys/core.h>
9b818146 33#endif
252b5132
RH
34
35/* forward declarations */
36
3f3c5c34
AM
37static asection *make_bfd_asection
38 PARAMS ((bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr));
b34976b6
AM
39static const bfd_target *osf_core_core_file_p
40 PARAMS ((bfd *));
41static char *osf_core_core_file_failing_command
42 PARAMS ((bfd *));
43static int osf_core_core_file_failing_signal
44 PARAMS ((bfd *));
69d246d9 45#define osf_core_core_file_matches_executable_p generic_core_file_matches_executable_p
b34976b6
AM
46static void swap_abort
47 PARAMS ((void));
252b5132
RH
48
49/* These are stored in the bfd's tdata */
50
dc810e39 51struct osf_core_struct
252b5132
RH
52{
53 int sig;
54 char cmd[MAXCOMLEN + 1];
55};
56
57#define core_hdr(bfd) ((bfd)->tdata.osf_core_data)
58#define core_signal(bfd) (core_hdr(bfd)->sig)
59#define core_command(bfd) (core_hdr(bfd)->cmd)
60
61static asection *
eea6121a 62make_bfd_asection (abfd, name, flags, size, vma, filepos)
252b5132 63 bfd *abfd;
dc810e39 64 const char *name;
252b5132 65 flagword flags;
eea6121a 66 bfd_size_type size;
252b5132
RH
67 bfd_vma vma;
68 file_ptr filepos;
69{
70 asection *asect;
71
117ed4f8 72 asect = bfd_make_section_anyway_with_flags (abfd, name, flags);
252b5132
RH
73 if (!asect)
74 return NULL;
75
eea6121a 76 asect->size = size;
252b5132
RH
77 asect->vma = vma;
78 asect->filepos = filepos;
79 asect->alignment_power = 8;
80
81 return asect;
82}
83
252b5132
RH
84static const bfd_target *
85osf_core_core_file_p (abfd)
86 bfd *abfd;
87{
88 int val;
89 int i;
90 char *secname;
91 struct core_filehdr core_header;
dc810e39 92 bfd_size_type amt;
252b5132 93
dc810e39
AM
94 amt = sizeof core_header;
95 val = bfd_bread ((PTR) &core_header, amt, abfd);
252b5132
RH
96 if (val != sizeof core_header)
97 return NULL;
98
0112cd26 99 if (! CONST_STRNEQ (core_header.magic, "Core"))
252b5132
RH
100 return NULL;
101
102 core_hdr (abfd) = (struct osf_core_struct *)
dc810e39 103 bfd_zalloc (abfd, (bfd_size_type) sizeof (struct osf_core_struct));
252b5132
RH
104 if (!core_hdr (abfd))
105 return NULL;
106
107 strncpy (core_command (abfd), core_header.name, MAXCOMLEN + 1);
108 core_signal (abfd) = core_header.signo;
109
110 for (i = 0; i < core_header.nscns; i++)
111 {
112 struct core_scnhdr core_scnhdr;
113 flagword flags;
114
dc810e39
AM
115 amt = sizeof core_scnhdr;
116 val = bfd_bread ((PTR) &core_scnhdr, amt, abfd);
252b5132
RH
117 if (val != sizeof core_scnhdr)
118 break;
119
120 /* Skip empty sections. */
121 if (core_scnhdr.size == 0 || core_scnhdr.scnptr == 0)
122 continue;
123
124 switch (core_scnhdr.scntype)
125 {
126 case SCNRGN:
127 secname = ".data";
128 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
129 break;
130 case SCNSTACK:
131 secname = ".stack";
132 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
133 break;
134 case SCNREGS:
135 secname = ".reg";
136 flags = SEC_HAS_CONTENTS;
137 break;
138 default:
139 (*_bfd_error_handler) (_("Unhandled OSF/1 core file section type %d\n"),
140 core_scnhdr.scntype);
141 continue;
142 }
143
144 if (!make_bfd_asection (abfd, secname, flags,
145 (bfd_size_type) core_scnhdr.size,
146 (bfd_vma) core_scnhdr.vaddr,
147 (file_ptr) core_scnhdr.scnptr))
9e7b37b3 148 goto fail;
252b5132
RH
149 }
150
151 /* OK, we believe you. You're a core file (sure, sure). */
152
153 return abfd->xvec;
9e7b37b3
AM
154
155 fail:
156 bfd_release (abfd, core_hdr (abfd));
157 core_hdr (abfd) = NULL;
158 bfd_section_list_clear (abfd);
159 return NULL;
252b5132
RH
160}
161
162static char *
163osf_core_core_file_failing_command (abfd)
164 bfd *abfd;
165{
166 return core_command (abfd);
167}
168
252b5132
RH
169static int
170osf_core_core_file_failing_signal (abfd)
171 bfd *abfd;
172{
173 return core_signal (abfd);
174}
252b5132 175\f
252b5132
RH
176/* If somebody calls any byte-swapping routines, shoot them. */
177static void
178swap_abort()
179{
180 abort(); /* This way doesn't require any declaration for ANSI to fuck up */
181}
8ce8c090 182
edeb6e24
AM
183#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
184#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
185#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
186#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
187#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
188#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132
RH
189
190const bfd_target osf_core_vec =
191 {
192 "osf-core",
193 bfd_target_unknown_flavour,
a68d41fb
AM
194 BFD_ENDIAN_LITTLE, /* target byte order */
195 BFD_ENDIAN_LITTLE, /* target headers byte order */
252b5132
RH
196 (HAS_RELOC | EXEC_P | /* object flags */
197 HAS_LINENO | HAS_DEBUG |
198 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
199 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
200 0, /* symbol prefix */
201 ' ', /* ar_pad_char */
202 16, /* ar_max_namelen */
8ce8c090 203 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data */
edeb6e24
AM
204 NO_GET, NO_GETS, NO_PUT, /* 32 bit data */
205 NO_GET, NO_GETS, NO_PUT, /* 16 bit data */
8ce8c090 206 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs */
edeb6e24
AM
207 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs */
208 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs */
252b5132
RH
209
210 { /* bfd_check_format */
8ce8c090
AM
211 _bfd_dummy_target, /* unknown format */
212 _bfd_dummy_target, /* object file */
213 _bfd_dummy_target, /* archive */
214 osf_core_core_file_p /* a core file */
252b5132
RH
215 },
216 { /* bfd_set_format */
8ce8c090
AM
217 bfd_false, bfd_false,
218 bfd_false, bfd_false
252b5132
RH
219 },
220 { /* bfd_write_contents */
8ce8c090
AM
221 bfd_false, bfd_false,
222 bfd_false, bfd_false
252b5132 223 },
dc810e39 224
3f3c5c34
AM
225 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
226 BFD_JUMP_TABLE_COPY (_bfd_generic),
227 BFD_JUMP_TABLE_CORE (osf_core),
228 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
229 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
230 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
231 BFD_JUMP_TABLE_WRITE (_bfd_generic),
232 BFD_JUMP_TABLE_LINK (_bfd_nolink),
233 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 234
c3c89269 235 NULL,
dc810e39 236
252b5132 237 (PTR) 0 /* backend_data */
8ce8c090 238 };