source: trunk/binutils/bfd/osf-core.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.5 KB
Line 
1/* BFD back-end for OSF/1 core files.
2 Copyright 1993, 1994, 1995, 1998, 1999, 2001, 2002
3 Free Software Foundation, Inc.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21/* This file can only be compiled on systems which use OSF/1 style
22 core files. */
23
24#include "bfd.h"
25#include "sysdep.h"
26#include "libbfd.h"
27
28#include <sys/user.h>
29#include <sys/core.h>
30
31/* forward declarations */
32
33static asection *make_bfd_asection
34 PARAMS ((bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr));
35static const bfd_target *osf_core_core_file_p
36 PARAMS ((bfd *));
37static char *osf_core_core_file_failing_command
38 PARAMS ((bfd *));
39static int osf_core_core_file_failing_signal
40 PARAMS ((bfd *));
41static bfd_boolean osf_core_core_file_matches_executable_p
42 PARAMS ((bfd *, bfd *));
43static void swap_abort
44 PARAMS ((void));
45
46/* These are stored in the bfd's tdata */
47
48struct osf_core_struct
49{
50 int sig;
51 char cmd[MAXCOMLEN + 1];
52};
53
54#define core_hdr(bfd) ((bfd)->tdata.osf_core_data)
55#define core_signal(bfd) (core_hdr(bfd)->sig)
56#define core_command(bfd) (core_hdr(bfd)->cmd)
57
58static asection *
59make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
60 bfd *abfd;
61 const char *name;
62 flagword flags;
63 bfd_size_type _raw_size;
64 bfd_vma vma;
65 file_ptr filepos;
66{
67 asection *asect;
68
69 asect = bfd_make_section_anyway (abfd, name);
70 if (!asect)
71 return NULL;
72
73 asect->flags = flags;
74 asect->_raw_size = _raw_size;
75 asect->vma = vma;
76 asect->filepos = filepos;
77 asect->alignment_power = 8;
78
79 return asect;
80}
81
82static const bfd_target *
83osf_core_core_file_p (abfd)
84 bfd *abfd;
85{
86 int val;
87 int i;
88 char *secname;
89 struct core_filehdr core_header;
90 bfd_size_type amt;
91
92 amt = sizeof core_header;
93 val = bfd_bread ((PTR) &core_header, amt, abfd);
94 if (val != sizeof core_header)
95 return NULL;
96
97 if (strncmp (core_header.magic, "Core", 4) != 0)
98 return NULL;
99
100 core_hdr (abfd) = (struct osf_core_struct *)
101 bfd_zalloc (abfd, (bfd_size_type) sizeof (struct osf_core_struct));
102 if (!core_hdr (abfd))
103 return NULL;
104
105 strncpy (core_command (abfd), core_header.name, MAXCOMLEN + 1);
106 core_signal (abfd) = core_header.signo;
107
108 for (i = 0; i < core_header.nscns; i++)
109 {
110 struct core_scnhdr core_scnhdr;
111 flagword flags;
112
113 amt = sizeof core_scnhdr;
114 val = bfd_bread ((PTR) &core_scnhdr, amt, abfd);
115 if (val != sizeof core_scnhdr)
116 break;
117
118 /* Skip empty sections. */
119 if (core_scnhdr.size == 0 || core_scnhdr.scnptr == 0)
120 continue;
121
122 switch (core_scnhdr.scntype)
123 {
124 case SCNRGN:
125 secname = ".data";
126 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
127 break;
128 case SCNSTACK:
129 secname = ".stack";
130 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
131 break;
132 case SCNREGS:
133 secname = ".reg";
134 flags = SEC_HAS_CONTENTS;
135 break;
136 default:
137 (*_bfd_error_handler) (_("Unhandled OSF/1 core file section type %d\n"),
138 core_scnhdr.scntype);
139 continue;
140 }
141
142 if (!make_bfd_asection (abfd, secname, flags,
143 (bfd_size_type) core_scnhdr.size,
144 (bfd_vma) core_scnhdr.vaddr,
145 (file_ptr) core_scnhdr.scnptr))
146 goto fail;
147 }
148
149 /* OK, we believe you. You're a core file (sure, sure). */
150
151 return abfd->xvec;
152
153 fail:
154 bfd_release (abfd, core_hdr (abfd));
155 core_hdr (abfd) = NULL;
156 bfd_section_list_clear (abfd);
157 return NULL;
158}
159
160static char *
161osf_core_core_file_failing_command (abfd)
162 bfd *abfd;
163{
164 return core_command (abfd);
165}
166
167/* ARGSUSED */
168static int
169osf_core_core_file_failing_signal (abfd)
170 bfd *abfd;
171{
172 return core_signal (abfd);
173}
174
175/* ARGSUSED */
176static bfd_boolean
177osf_core_core_file_matches_executable_p (core_bfd, exec_bfd)
178 bfd *core_bfd ATTRIBUTE_UNUSED;
179 bfd *exec_bfd ATTRIBUTE_UNUSED;
180{
181 return TRUE; /* FIXME, We have no way of telling at this point */
182}
183
184
185/* If somebody calls any byte-swapping routines, shoot them. */
186static void
187swap_abort()
188{
189 abort(); /* This way doesn't require any declaration for ANSI to fuck up */
190}
191#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort )
192#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
193#define NO_SIGNED_GET \
194 ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
195
196const bfd_target osf_core_vec =
197 {
198 "osf-core",
199 bfd_target_unknown_flavour,
200 BFD_ENDIAN_LITTLE, /* target byte order */
201 BFD_ENDIAN_LITTLE, /* target headers byte order */
202 (HAS_RELOC | EXEC_P | /* object flags */
203 HAS_LINENO | HAS_DEBUG |
204 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
205 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
206 0, /* symbol prefix */
207 ' ', /* ar_pad_char */
208 16, /* ar_max_namelen */
209 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */
210 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */
211 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */
212 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */
213 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */
214 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */
215
216 { /* bfd_check_format */
217 _bfd_dummy_target, /* unknown format */
218 _bfd_dummy_target, /* object file */
219 _bfd_dummy_target, /* archive */
220 osf_core_core_file_p /* a core file */
221 },
222 { /* bfd_set_format */
223 bfd_false, bfd_false,
224 bfd_false, bfd_false
225 },
226 { /* bfd_write_contents */
227 bfd_false, bfd_false,
228 bfd_false, bfd_false
229 },
230
231 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
232 BFD_JUMP_TABLE_COPY (_bfd_generic),
233 BFD_JUMP_TABLE_CORE (osf_core),
234 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
235 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
236 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
237 BFD_JUMP_TABLE_WRITE (_bfd_generic),
238 BFD_JUMP_TABLE_LINK (_bfd_nolink),
239 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
240
241 NULL,
242
243 (PTR) 0 /* backend_data */
244};
Note: See TracBrowser for help on using the repository browser.