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 #include <sys/dir.h>
00034 #include <signal.h>
00035 #include <sys/core.h>
00036
00037
00038
00039 #define M_SPARC64_OPENBSD M_MIPS1
00040
00041
00042
00043 #define CORE_WCOOKIE_OFFSET 344
00044
00045 struct netbsd_core_struct
00046 {
00047 struct core core;
00048 } *rawptr;
00049
00050
00051
00052 static const bfd_target *netbsd_core_file_p
00053 PARAMS ((bfd *abfd));
00054 static char *netbsd_core_file_failing_command
00055 PARAMS ((bfd *abfd));
00056 static int netbsd_core_file_failing_signal
00057 PARAMS ((bfd *abfd));
00058 static bfd_boolean netbsd_core_file_matches_executable_p
00059 PARAMS ((bfd *core_bfd, bfd *exec_bfd));
00060 static void swap_abort
00061 PARAMS ((void));
00062
00063
00064
00065 static const bfd_target *
00066 netbsd_core_file_p (abfd)
00067 bfd *abfd;
00068
00069 {
00070 int val;
00071 unsigned i;
00072 file_ptr offset;
00073 asection *asect;
00074 struct core core;
00075 struct coreseg coreseg;
00076 bfd_size_type amt = sizeof core;
00077
00078 val = bfd_bread ((void *) &core, amt, abfd);
00079 if (val != sizeof core)
00080 {
00081
00082 bfd_set_error (bfd_error_wrong_format);
00083 return 0;
00084 }
00085
00086 if (CORE_GETMAGIC (core) != COREMAGIC)
00087 {
00088 bfd_set_error (bfd_error_wrong_format);
00089 return 0;
00090 }
00091
00092 amt = sizeof (struct netbsd_core_struct);
00093 rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
00094 if (rawptr == NULL)
00095 return 0;
00096
00097 rawptr->core = core;
00098 abfd->tdata.netbsd_core_data = rawptr;
00099
00100 offset = core.c_hdrsize;
00101 for (i = 0; i < core.c_nseg; i++)
00102 {
00103 const char *sname;
00104 flagword flags;
00105
00106 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
00107 goto punt;
00108
00109 val = bfd_bread ((void *) &coreseg, (bfd_size_type) sizeof coreseg, abfd);
00110 if (val != sizeof coreseg)
00111 {
00112 bfd_set_error (bfd_error_file_truncated);
00113 goto punt;
00114 }
00115 if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
00116 {
00117 bfd_set_error (bfd_error_wrong_format);
00118 goto punt;
00119 }
00120
00121 offset += core.c_seghdrsize;
00122
00123 switch (CORE_GETFLAG (coreseg))
00124 {
00125 case CORE_CPU:
00126 sname = ".reg";
00127 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00128 break;
00129 case CORE_DATA:
00130 sname = ".data";
00131 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00132 break;
00133 case CORE_STACK:
00134 sname = ".stack";
00135 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00136 break;
00137 default:
00138 sname = ".unknown";
00139 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00140 break;
00141 }
00142 asect = bfd_make_section_anyway (abfd, sname);
00143 if (asect == NULL)
00144 goto punt;
00145
00146 asect->flags = flags;
00147 asect->size = coreseg.c_size;
00148 asect->vma = coreseg.c_addr;
00149 asect->filepos = offset;
00150 asect->alignment_power = 2;
00151
00152 if (CORE_GETMID (core) == M_SPARC_NETBSD
00153 && CORE_GETFLAG (coreseg) == CORE_CPU
00154 && coreseg.c_size > CORE_WCOOKIE_OFFSET)
00155 {
00156
00157 asect->size = CORE_WCOOKIE_OFFSET;
00158
00159
00160 asect = bfd_make_section_anyway (abfd, ".wcookie");
00161 if (asect == NULL)
00162 goto punt;
00163
00164 asect->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00165 asect->size = 4;
00166 asect->vma = 0;
00167 asect->filepos = offset + CORE_WCOOKIE_OFFSET;
00168 asect->alignment_power = 2;
00169 }
00170
00171 offset += coreseg.c_size;
00172 }
00173
00174
00175 switch (CORE_GETMID (core))
00176 {
00177 case M_ALPHA_NETBSD:
00178 bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
00179 break;
00180
00181 case M_ARM6_NETBSD:
00182 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_3);
00183 break;
00184
00185 case M_X86_64_NETBSD:
00186 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
00187 break;
00188
00189 case M_386_NETBSD:
00190 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
00191 break;
00192
00193 case M_68K_NETBSD:
00194 case M_68K4K_NETBSD:
00195 bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
00196 break;
00197
00198 case M_88K_OPENBSD:
00199 bfd_default_set_arch_mach (abfd, bfd_arch_m88k, 0);
00200 break;
00201
00202 case M_HPPA_OPENBSD:
00203 bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
00204 break;
00205
00206 case M_POWERPC_NETBSD:
00207 bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
00208 break;
00209
00210 case M_SPARC_NETBSD:
00211 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
00212 break;
00213
00214 case M_SPARC64_NETBSD:
00215 case M_SPARC64_OPENBSD:
00216 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
00217 break;
00218
00219 case M_VAX_NETBSD:
00220 case M_VAX4K_NETBSD:
00221 bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
00222 break;
00223 }
00224
00225
00226 return abfd->xvec;
00227
00228 punt:
00229 bfd_release (abfd, abfd->tdata.any);
00230 abfd->tdata.any = NULL;
00231 bfd_section_list_clear (abfd);
00232 return 0;
00233 }
00234
00235 static char*
00236 netbsd_core_file_failing_command (abfd)
00237 bfd *abfd;
00238 {
00239
00240 return abfd->tdata.netbsd_core_data->core.c_name;
00241 }
00242
00243 static int
00244 netbsd_core_file_failing_signal (abfd)
00245 bfd *abfd;
00246 {
00247
00248 return abfd->tdata.netbsd_core_data->core.c_signo;
00249 }
00250
00251 static bfd_boolean
00252 netbsd_core_file_matches_executable_p (core_bfd, exec_bfd)
00253 bfd *core_bfd ATTRIBUTE_UNUSED;
00254 bfd *exec_bfd ATTRIBUTE_UNUSED;
00255 {
00256
00257 return TRUE;
00258 }
00259
00260
00261
00262 static void
00263 swap_abort ()
00264 {
00265
00266 abort ();
00267 }
00268
00269 #define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
00270 #define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
00271 #define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
00272 #define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
00273 #define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
00274 #define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
00275
00276 const bfd_target netbsd_core_vec =
00277 {
00278 "netbsd-core",
00279 bfd_target_unknown_flavour,
00280 BFD_ENDIAN_UNKNOWN,
00281 BFD_ENDIAN_UNKNOWN,
00282 (HAS_RELOC | EXEC_P |
00283 HAS_LINENO | HAS_DEBUG |
00284 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
00285 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
00286 0,
00287 ' ',
00288 16,
00289 NO_GET64, NO_GETS64, NO_PUT64,
00290 NO_GET, NO_GETS, NO_PUT,
00291 NO_GET, NO_GETS, NO_PUT,
00292 NO_GET64, NO_GETS64, NO_PUT64,
00293 NO_GET, NO_GETS, NO_PUT,
00294 NO_GET, NO_GETS, NO_PUT,
00295
00296 {
00297 _bfd_dummy_target,
00298 _bfd_dummy_target,
00299 _bfd_dummy_target,
00300 netbsd_core_file_p
00301 },
00302 {
00303 bfd_false, bfd_false,
00304 bfd_false, bfd_false
00305 },
00306 {
00307 bfd_false, bfd_false,
00308 bfd_false, bfd_false
00309 },
00310
00311 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
00312 BFD_JUMP_TABLE_COPY (_bfd_generic),
00313 BFD_JUMP_TABLE_CORE (netbsd),
00314 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
00315 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
00316 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
00317 BFD_JUMP_TABLE_WRITE (_bfd_generic),
00318 BFD_JUMP_TABLE_LINK (_bfd_nolink),
00319 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
00320
00321 NULL,
00322
00323 (PTR) 0
00324 };