00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "bfd.h"
00028 #include "sysdep.h"
00029 #include "libbfd.h"
00030 #include "libaout.h"
00031
00032 #include <sys/param.h>
00033 #ifdef HAVE_DIRENT_H
00034 # include <dirent.h>
00035 #else
00036 # ifdef HAVE_SYS_NDIR_H
00037 # include <sys/ndir.h>
00038 # endif
00039 # ifdef HAVE_SYS_DIR_H
00040 # include <sys/dir.h>
00041 # endif
00042 # ifdef HAVE_NDIR_H
00043 # include <ndir.h>
00044 # endif
00045 #endif
00046 #include <signal.h>
00047
00048 #include <sys/user.h>
00049
00050 #ifdef TRAD_HEADER
00051 #include TRAD_HEADER
00052 #endif
00053
00054 struct trad_core_struct
00055 {
00056 asection *data_section;
00057 asection *stack_section;
00058 asection *reg_section;
00059 struct user u;
00060 };
00061
00062 #define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u))
00063 #define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section)
00064 #define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section)
00065 #define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section)
00066
00067
00068
00069 const bfd_target *trad_unix_core_file_p PARAMS ((bfd *abfd));
00070 char * trad_unix_core_file_failing_command PARAMS ((bfd *abfd));
00071 int trad_unix_core_file_failing_signal PARAMS ((bfd *abfd));
00072 bfd_boolean trad_unix_core_file_matches_executable_p
00073 PARAMS ((bfd *core_bfd, bfd *exec_bfd));
00074 static void swap_abort PARAMS ((void));
00075
00076
00077
00078 const bfd_target *
00079 trad_unix_core_file_p (abfd)
00080 bfd *abfd;
00081
00082 {
00083 int val;
00084 struct user u;
00085 struct trad_core_struct *rawptr;
00086 bfd_size_type amt;
00087
00088 #ifdef TRAD_CORE_USER_OFFSET
00089
00090 if (bfd_seek (abfd, (file_ptr) TRAD_CORE_USER_OFFSET, SEEK_SET) != 0)
00091 return 0;
00092 #endif
00093
00094 val = bfd_bread ((void *) &u, (bfd_size_type) sizeof u, abfd);
00095 if (val != sizeof u)
00096 {
00097
00098 bfd_set_error (bfd_error_wrong_format);
00099 return 0;
00100 }
00101
00102
00103 if (u.u_dsize > 0x1000000)
00104 {
00105 bfd_set_error (bfd_error_wrong_format);
00106 return 0;
00107 }
00108 if (u.u_ssize > 0x1000000)
00109 {
00110 bfd_set_error (bfd_error_wrong_format);
00111 return 0;
00112 }
00113
00114
00115 {
00116 FILE *stream = bfd_cache_lookup (abfd);
00117 struct stat statbuf;
00118
00119 if (fstat (fileno (stream), &statbuf) < 0)
00120 {
00121 bfd_set_error (bfd_error_system_call);
00122 return 0;
00123 }
00124 if ((unsigned long) (NBPG * (UPAGES + u.u_dsize
00125 #ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE
00126 - u.u_tsize
00127 #endif
00128 + u.u_ssize))
00129 > (unsigned long) statbuf.st_size)
00130 {
00131 bfd_set_error (bfd_error_wrong_format);
00132 return 0;
00133 }
00134 #ifndef TRAD_CORE_ALLOW_ANY_EXTRA_SIZE
00135 if ((unsigned long) (NBPG * (UPAGES + u.u_dsize + u.u_ssize)
00136 #ifdef TRAD_CORE_EXTRA_SIZE_ALLOWED
00137
00138 + TRAD_CORE_EXTRA_SIZE_ALLOWED
00139 #endif
00140 )
00141 < (unsigned long) statbuf.st_size)
00142 {
00143
00144
00145 bfd_set_error (bfd_error_wrong_format);
00146 return 0;
00147 }
00148 #endif
00149 }
00150
00151
00152
00153
00154
00155 amt = sizeof (struct trad_core_struct);
00156 rawptr = (struct trad_core_struct *) bfd_zmalloc (amt);
00157 if (rawptr == NULL)
00158 return 0;
00159
00160 abfd->tdata.trad_core_data = rawptr;
00161
00162 rawptr->u = u;
00163
00164
00165
00166 core_stacksec(abfd) = bfd_make_section_anyway (abfd, ".stack");
00167 if (core_stacksec (abfd) == NULL)
00168 goto fail;
00169 core_datasec (abfd) = bfd_make_section_anyway (abfd, ".data");
00170 if (core_datasec (abfd) == NULL)
00171 goto fail;
00172 core_regsec (abfd) = bfd_make_section_anyway (abfd, ".reg");
00173 if (core_regsec (abfd) == NULL)
00174 goto fail;
00175
00176 core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00177 core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00178 core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
00179
00180 core_datasec (abfd)->size = NBPG * u.u_dsize
00181 #ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE
00182 - NBPG * u.u_tsize
00183 #endif
00184 ;
00185 core_stacksec (abfd)->size = NBPG * u.u_ssize;
00186 core_regsec (abfd)->size = NBPG * UPAGES;
00187
00188
00189
00190 #ifdef HOST_DATA_START_ADDR
00191 core_datasec (abfd)->vma = HOST_DATA_START_ADDR;
00192 #else
00193 core_datasec (abfd)->vma = HOST_TEXT_START_ADDR + (NBPG * u.u_tsize);
00194 #endif
00195
00196 #ifdef HOST_STACK_START_ADDR
00197 core_stacksec (abfd)->vma = HOST_STACK_START_ADDR;
00198 #else
00199 core_stacksec (abfd)->vma = HOST_STACK_END_ADDR - (NBPG * u.u_ssize);
00200 #endif
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 core_regsec (abfd)->vma = - (bfd_vma) (unsigned long) u.u_ar0;
00217
00218 core_datasec (abfd)->filepos = NBPG * UPAGES;
00219 core_stacksec (abfd)->filepos = (NBPG * UPAGES) + NBPG * u.u_dsize
00220 #ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE
00221 - NBPG * u.u_tsize
00222 #endif
00223 ;
00224 core_regsec (abfd)->filepos = 0;
00225
00226
00227 core_stacksec (abfd)->alignment_power = 2;
00228 core_datasec (abfd)->alignment_power = 2;
00229 core_regsec (abfd)->alignment_power = 2;
00230
00231 return abfd->xvec;
00232
00233 fail:
00234 bfd_release (abfd, abfd->tdata.any);
00235 abfd->tdata.any = NULL;
00236 bfd_section_list_clear (abfd);
00237 return NULL;
00238 }
00239
00240 char *
00241 trad_unix_core_file_failing_command (abfd)
00242 bfd *abfd;
00243 {
00244 #ifndef NO_CORE_COMMAND
00245 char *com = abfd->tdata.trad_core_data->u.u_comm;
00246 if (*com)
00247 return com;
00248 else
00249 #endif
00250 return 0;
00251 }
00252
00253 int
00254 trad_unix_core_file_failing_signal (ignore_abfd)
00255 bfd *ignore_abfd ATTRIBUTE_UNUSED;
00256 {
00257 #ifdef TRAD_UNIX_CORE_FILE_FAILING_SIGNAL
00258 return TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(ignore_abfd);
00259 #else
00260 return -1;
00261 #endif
00262 }
00263
00264 bfd_boolean
00265 trad_unix_core_file_matches_executable_p (core_bfd, exec_bfd)
00266 bfd *core_bfd ATTRIBUTE_UNUSED;
00267 bfd *exec_bfd ATTRIBUTE_UNUSED;
00268 {
00269 return TRUE;
00270 }
00271
00272
00273 static void
00274 swap_abort ()
00275 {
00276 abort ();
00277 }
00278
00279 #define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
00280 #define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
00281 #define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
00282 #define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
00283 #define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
00284 #define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
00285
00286 const bfd_target trad_core_vec =
00287 {
00288 "trad-core",
00289 bfd_target_unknown_flavour,
00290 BFD_ENDIAN_UNKNOWN,
00291 BFD_ENDIAN_UNKNOWN,
00292 (HAS_RELOC | EXEC_P |
00293 HAS_LINENO | HAS_DEBUG |
00294 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
00295 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
00296 0,
00297 ' ',
00298 16,
00299 NO_GET64, NO_GETS64, NO_PUT64,
00300 NO_GET, NO_GETS, NO_PUT,
00301 NO_GET, NO_GETS, NO_PUT,
00302 NO_GET64, NO_GETS64, NO_PUT64,
00303 NO_GET, NO_GETS, NO_PUT,
00304 NO_GET, NO_GETS, NO_PUT,
00305
00306 {
00307 _bfd_dummy_target,
00308 _bfd_dummy_target,
00309 _bfd_dummy_target,
00310 trad_unix_core_file_p
00311 },
00312 {
00313 bfd_false, bfd_false,
00314 bfd_false, bfd_false
00315 },
00316 {
00317 bfd_false, bfd_false,
00318 bfd_false, bfd_false
00319 },
00320
00321 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
00322 BFD_JUMP_TABLE_COPY (_bfd_generic),
00323 BFD_JUMP_TABLE_CORE (trad_unix),
00324 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
00325 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
00326 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
00327 BFD_JUMP_TABLE_WRITE (_bfd_generic),
00328 BFD_JUMP_TABLE_LINK (_bfd_nolink),
00329 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
00330
00331 NULL,
00332
00333 (PTR) 0
00334 };