ptrace-core.c revision 60484
1145524Sdarrenr/* BFD backend for core files which use the ptrace_user structure 2145524Sdarrenr Copyright 1993, 94, 95, 96, 1998 Free Software Foundation, Inc. 3298107Sgjb The structure of this file is based on trad-core.c written by John Gilmore 4145524Sdarrenr of Cygnus Support. 5145630Sdarrenr Modified to work with the ptrace_user structure by Kevin A. Buettner. 6145524Sdarrenr (Longterm it may be better to merge this file with trad-core.c) 7255332Scy 8255332ScyThis file is part of BFD, the Binary File Descriptor library. 9255332Scy 10255332ScyThis program is free software; you can redistribute it and/or modify 11255332Scyit under the terms of the GNU General Public License as published by 12255332Scythe Free Software Foundation; either version 2 of the License, or 13255332Scy(at your option) any later version. 14255332Scy 15255332ScyThis program is distributed in the hope that it will be useful, 16255332Scybut WITHOUT ANY WARRANTY; without even the implied warranty of 17170268SdarrenrMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18255332ScyGNU General Public License for more details. 19255332Scy 20255332ScyYou should have received a copy of the GNU General Public License 21255332Scyalong with this program; if not, write to the Free Software 22255332ScyFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 23255332Scy 24170268Sdarrenr#ifdef PTRACE_CORE 25255332Scy 26170268Sdarrenr#include "bfd.h" 27255332Scy#include "sysdep.h" 28255332Scy#include "libbfd.h" 29255332Scy 30255332Scy#include <sys/param.h> 31255332Scy#include <sys/dir.h> 32255332Scy#include <signal.h> 33255332Scy#include <sys/ptrace.h> 34170268Sdarrenr 35255332Scy 36255332Scystruct trad_core_struct 37255332Scy { 38255332Scy asection *data_section; 39255332Scy asection *stack_section; 40255332Scy asection *reg_section; 41255332Scy struct ptrace_user u; 42170268Sdarrenr }; 43255332Scy 44170268Sdarrenr#define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u)) 45170268Sdarrenr#define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section) 46145524Sdarrenr#define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section) 47291735Sbdrewery#define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section) 48291735Sbdrewery 49145524Sdarrenr/* 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)); 54boolean 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 68 val = bfd_read ((void *)&u, 1, sizeof u, abfd); 69 if (val != sizeof u || u.pt_magic != _BCS_PTRACE_MAGIC 70 || u.pt_rev != _BCS_PTRACE_REV) 71 { 72 /* Too small to be a core file */ 73 bfd_set_error (bfd_error_wrong_format); 74 return 0; 75 } 76 77 /* OK, we believe you. You're a core file (sure, sure). */ 78 79 /* Allocate both the upage and the struct core_data at once, so 80 a single free() will free them both. */ 81 rawptr = (struct trad_core_struct *) 82 bfd_zalloc (abfd, sizeof (struct trad_core_struct)); 83 84 if (rawptr == NULL) 85 return 0; 86 87 abfd->tdata.trad_core_data = rawptr; 88 89 rawptr->u = u; /*Copy the uarea into the tdata part of the bfd */ 90 91 /* Create the sections. This is raunchy, but bfd_close wants to free 92 them separately. */ 93 94 core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); 95 if (core_stacksec (abfd) == NULL) 96 return NULL; 97 core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); 98 if (core_datasec (abfd) == NULL) 99 return NULL; 100 core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); 101 if (core_regsec (abfd) == NULL) 102 return NULL; 103 104 core_stacksec (abfd)->name = ".stack"; 105 core_datasec (abfd)->name = ".data"; 106 core_regsec (abfd)->name = ".reg"; 107 108 /* FIXME: Need to worry about shared memory, library data, and library 109 text. I don't think that any of these things are supported on the 110 system on which I am developing this for though. */ 111 112 113 core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; 114 core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; 115 core_regsec (abfd)->flags = SEC_HAS_CONTENTS; 116 117 core_datasec (abfd)->_raw_size = u.pt_dsize; 118 core_stacksec (abfd)->_raw_size = u.pt_ssize; 119 core_regsec (abfd)->_raw_size = sizeof(u); 120 121 core_datasec (abfd)->vma = u.pt_o_data_start; 122 core_stacksec (abfd)->vma = USRSTACK - u.pt_ssize; 123 core_regsec (abfd)->vma = 0 - sizeof(u); /* see trad-core.c */ 124 125 core_datasec (abfd)->filepos = (int) u.pt_dataptr; 126 core_stacksec (abfd)->filepos = (int) (u.pt_dataptr + u.pt_dsize); 127 core_regsec (abfd)->filepos = 0; /* Register segment is ptrace_user */ 128 129 /* Align to word at least */ 130 core_stacksec (abfd)->alignment_power = 2; 131 core_datasec (abfd)->alignment_power = 2; 132 core_regsec (abfd)->alignment_power = 2; 133 134 abfd->sections = core_stacksec (abfd); 135 core_stacksec (abfd)->next = core_datasec (abfd); 136 core_datasec (abfd)->next = core_regsec (abfd); 137 abfd->section_count = 3; 138 139 return abfd->xvec; 140} 141 142char * 143ptrace_unix_core_file_failing_command (abfd) 144 bfd *abfd; 145{ 146 char *com = abfd->tdata.trad_core_data->u.pt_comm; 147 if (*com) 148 return com; 149 else 150 return 0; 151} 152 153/* ARGSUSED */ 154int 155ptrace_unix_core_file_failing_signal (abfd) 156 bfd *abfd; 157{ 158 return abfd->tdata.trad_core_data->u.pt_sigframe.sig_num; 159} 160 161/* ARGSUSED */ 162boolean 163ptrace_unix_core_file_matches_executable_p (core_bfd, exec_bfd) 164 bfd *core_bfd, *exec_bfd; 165{ 166 /* FIXME: Use pt_timdat field of the ptrace_user structure to match 167 the date of the executable */ 168 return true; 169} 170 171/* If somebody calls any byte-swapping routines, shoot them. */ 172static void 173swap_abort() 174{ 175 abort(); /* This way doesn't require any declaration for ANSI to fuck up */ 176} 177#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) 178#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) 179#define NO_SIGNED_GET \ 180 ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) 181 182const bfd_target ptrace_core_vec = 183 { 184 "trad-core", 185 bfd_target_unknown_flavour, 186 BFD_ENDIAN_UNKNOWN, /* target byte order */ 187 BFD_ENDIAN_UNKNOWN, /* target headers byte order */ 188 (HAS_RELOC | EXEC_P | /* object flags */ 189 HAS_LINENO | HAS_DEBUG | 190 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), 191 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ 192 0, /* symbol prefix */ 193 ' ', /* ar_pad_char */ 194 16, /* ar_max_namelen */ 195 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ 196 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ 197 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ 198 NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ 199 NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ 200 NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ 201 202 { /* bfd_check_format */ 203 _bfd_dummy_target, /* unknown format */ 204 _bfd_dummy_target, /* object file */ 205 _bfd_dummy_target, /* archive */ 206 ptrace_unix_core_file_p /* a core file */ 207 }, 208 { /* bfd_set_format */ 209 bfd_false, bfd_false, 210 bfd_false, bfd_false 211 }, 212 { /* bfd_write_contents */ 213 bfd_false, bfd_false, 214 bfd_false, bfd_false 215 }, 216 217 BFD_JUMP_TABLE_GENERIC (_bfd_generic), 218 BFD_JUMP_TABLE_COPY (_bfd_generic), 219 BFD_JUMP_TABLE_CORE (ptrace_unix), 220 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), 221 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), 222 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), 223 BFD_JUMP_TABLE_WRITE (_bfd_generic), 224 BFD_JUMP_TABLE_LINK (_bfd_nolink), 225 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), 226 227 NULL, 228 229 (PTR) 0 /* backend_data */ 230}; 231 232#endif /* PTRACE_CORE */ 233