source: trunk/src/binutils/bfd/ptrace-core.c@ 907

Last change on this file since 907 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: 7.1 KB
Line 
1/* BFD backend for core files which use the ptrace_user structure
2 Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002
3 Free Software Foundation, Inc.
4 The structure of this file is based on trad-core.c written by John Gilmore
5 of Cygnus Support.
6 Modified to work with the ptrace_user structure by Kevin A. Buettner.
7 (Longterm it may be better to merge this file with trad-core.c)
8
9This file is part of BFD, the Binary File Descriptor library.
10
11This program is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2 of the License, or
14(at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with this program; if not, write to the Free Software
23Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24
25#ifdef PTRACE_CORE
26
27#include "bfd.h"
28#include "sysdep.h"
29#include "libbfd.h"
30
31#include <sys/param.h>
32#include <sys/dir.h>
33#include <signal.h>
34#include <sys/ptrace.h>
35
36struct trad_core_struct
37 {
38 asection *data_section;
39 asection *stack_section;
40 asection *reg_section;
41 struct ptrace_user u;
42 };
43
44#define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u))
45#define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section)
46#define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section)
47#define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section)
48
49/* forward declarations */
50
51const bfd_target *ptrace_unix_core_file_p PARAMS ((bfd *abfd));
52char * ptrace_unix_core_file_failing_command PARAMS ((bfd *abfd));
53int ptrace_unix_core_file_failing_signal PARAMS ((bfd *abfd));
54bfd_boolean ptrace_unix_core_file_matches_executable_p
55 PARAMS ((bfd *core_bfd, bfd *exec_bfd));
56static void swap_abort PARAMS ((void));
57
58/* ARGSUSED */
59const bfd_target *
60ptrace_unix_core_file_p (abfd)
61 bfd *abfd;
62
63{
64 int val;
65 struct ptrace_user u;
66 struct trad_core_struct *rawptr;
67 bfd_size_type amt;
68
69 val = bfd_bread ((void *)&u, (bfd_size_type) sizeof u, abfd);
70 if (val != sizeof u || u.pt_magic != _BCS_PTRACE_MAGIC
71 || u.pt_rev != _BCS_PTRACE_REV)
72 {
73 /* Too small to be a core file */
74 bfd_set_error (bfd_error_wrong_format);
75 return 0;
76 }
77
78 /* OK, we believe you. You're a core file (sure, sure). */
79
80 /* Allocate both the upage and the struct core_data at once, so
81 a single free() will free them both. */
82 amt = sizeof (struct trad_core_struct);
83 rawptr = (struct trad_core_struct *) bfd_zalloc (abfd, amt);
84
85 if (rawptr == NULL)
86 return 0;
87
88 abfd->tdata.trad_core_data = rawptr;
89
90 rawptr->u = u; /*Copy the uarea into the tdata part of the bfd */
91
92 /* Create the sections. */
93
94 core_stacksec (abfd) = bfd_make_section_anyway (abfd, ".stack");
95 if (core_stacksec (abfd) == NULL)
96 goto fail;
97 core_datasec (abfd) = bfd_make_section_anyway (abfd, ".data");
98 if (core_datasec (abfd) == NULL)
99 goto fail;
100 core_regsec (abfd) = bfd_make_section_anyway (abfd, ".reg");
101 if (core_regsec (abfd) == NULL)
102 goto fail;
103
104 /* FIXME: Need to worry about shared memory, library data, and library
105 text. I don't think that any of these things are supported on the
106 system on which I am developing this for though. */
107
108 core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
109 core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
110 core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
111
112 core_datasec (abfd)->_raw_size = u.pt_dsize;
113 core_stacksec (abfd)->_raw_size = u.pt_ssize;
114 core_regsec (abfd)->_raw_size = sizeof (u);
115
116 core_datasec (abfd)->vma = u.pt_o_data_start;
117 core_stacksec (abfd)->vma = USRSTACK - u.pt_ssize;
118 core_regsec (abfd)->vma = 0 - sizeof (u); /* see trad-core.c */
119
120 core_datasec (abfd)->filepos = (int) u.pt_dataptr;
121 core_stacksec (abfd)->filepos = (int) (u.pt_dataptr + u.pt_dsize);
122 core_regsec (abfd)->filepos = 0; /* Register segment is ptrace_user */
123
124 /* Align to word at least */
125 core_stacksec (abfd)->alignment_power = 2;
126 core_datasec (abfd)->alignment_power = 2;
127 core_regsec (abfd)->alignment_power = 2;
128
129 return abfd->xvec;
130
131 fail:
132 bfd_release (abfd, abfd->tdata.any);
133 abfd->tdata.any = NULL;
134 bfd_section_list_clear (abfd);
135 return NULL;
136}
137
138char *
139ptrace_unix_core_file_failing_command (abfd)
140 bfd *abfd;
141{
142 char *com = abfd->tdata.trad_core_data->u.pt_comm;
143 if (*com)
144 return com;
145 else
146 return 0;
147}
148
149/* ARGSUSED */
150int
151ptrace_unix_core_file_failing_signal (abfd)
152 bfd *abfd;
153{
154 return abfd->tdata.trad_core_data->u.pt_sigframe.sig_num;
155}
156
157/* ARGSUSED */
158bfd_boolean
159ptrace_unix_core_file_matches_executable_p (core_bfd, exec_bfd)
160 bfd *core_bfd, *exec_bfd;
161{
162 /* FIXME: Use pt_timdat field of the ptrace_user structure to match
163 the date of the executable */
164 return TRUE;
165}
166
167
168/* If somebody calls any byte-swapping routines, shoot them. */
169static void
170swap_abort ()
171{
172 abort (); /* This way doesn't require any declaration for ANSI to fuck up */
173}
174#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort )
175#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort )
176#define NO_SIGNED_GET \
177 ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort )
178
179const bfd_target ptrace_core_vec =
180 {
181 "trad-core",
182 bfd_target_unknown_flavour,
183 BFD_ENDIAN_UNKNOWN, /* target byte order */
184 BFD_ENDIAN_UNKNOWN, /* target headers byte order */
185 (HAS_RELOC | EXEC_P | /* object flags */
186 HAS_LINENO | HAS_DEBUG |
187 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
188 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
189 0, /* symbol prefix */
190 ' ', /* ar_pad_char */
191 16, /* ar_max_namelen */
192 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */
193 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */
194 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */
195 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */
196 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */
197 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */
198
199 { /* bfd_check_format */
200 _bfd_dummy_target, /* unknown format */
201 _bfd_dummy_target, /* object file */
202 _bfd_dummy_target, /* archive */
203 ptrace_unix_core_file_p /* a core file */
204 },
205 { /* bfd_set_format */
206 bfd_false, bfd_false,
207 bfd_false, bfd_false
208 },
209 { /* bfd_write_contents */
210 bfd_false, bfd_false,
211 bfd_false, bfd_false
212 },
213
214 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
215 BFD_JUMP_TABLE_COPY (_bfd_generic),
216 BFD_JUMP_TABLE_CORE (ptrace_unix),
217 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
218 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
219 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
220 BFD_JUMP_TABLE_WRITE (_bfd_generic),
221 BFD_JUMP_TABLE_LINK (_bfd_nolink),
222 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
223
224 NULL,
225
226 (PTR) 0 /* backend_data */
227};
228
229#endif /* PTRACE_CORE */
Note: See TracBrowser for help on using the repository browser.