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
00028
00029
00030 #include "bfd.h"
00031 #include "sysdep.h"
00032 #include "libbfd.h"
00033 #include "coff/i386.h"
00034 #include "coff/internal.h"
00035 #include "libcoff.h"
00036
00037 #include <signal.h>
00038
00039 #if defined (_AIX) && defined (_I386)
00040 #define NOCHECKS
00041 #define _h_USER
00042 #include <uinfo.h>
00043 #include <sys/i386/coredump.h>
00044 #endif
00045
00046
00047
00048
00049
00050 #ifndef COR_MAGIC
00051 # define COR_MAGIC "core"
00052 #endif
00053
00054
00055 #define core_hdr(bfd) \
00056 (((bfd->tdata.trad_core_data))->hdr)
00057 #define core_section(bfd,n) \
00058 (((bfd)->tdata.trad_core_data)->sections[n])
00059 #define core_regsec(bfd) \
00060 (((bfd)->tdata.trad_core_data)->reg_section)
00061 #define core_reg2sec(bfd) \
00062 (((bfd)->tdata.trad_core_data)->reg2_section)
00063
00064
00065 struct trad_core_struct {
00066 struct corehdr *hdr;
00067 asection *reg_section;
00068 asection *reg2_section;
00069 asection *sections[MAX_CORE_SEGS];
00070 };
00071
00072 static void swap_abort PARAMS ((void));
00073
00074 static const bfd_target *
00075 aix386_core_file_p (abfd)
00076 bfd *abfd;
00077 {
00078 int i, n;
00079 unsigned char longbuf[4];
00080 bfd_size_type core_size = sizeof (struct corehdr);
00081 bfd_size_type amt;
00082 struct corehdr *core;
00083 struct mergem {
00084 struct trad_core_struct coredata;
00085 struct corehdr internal_core;
00086 } *mergem;
00087
00088 amt = sizeof (longbuf);
00089 if (bfd_bread ((PTR) longbuf, amt, abfd) != amt)
00090 {
00091 if (bfd_get_error () != bfd_error_system_call)
00092 bfd_set_error (bfd_error_wrong_format);
00093 return 0;
00094 }
00095
00096 if (strncmp (longbuf, COR_MAGIC, 4))
00097 return 0;
00098
00099 if (bfd_seek (abfd, (file_ptr) 0, 0) != 0)
00100 return 0;
00101
00102 amt = sizeof (struct mergem);
00103 mergem = (struct mergem *) bfd_zalloc (abfd, amt);
00104 if (mergem == NULL)
00105 return 0;
00106
00107 core = &mergem->internal_core;
00108
00109 if ((bfd_bread ((PTR) core, core_size, abfd)) != core_size)
00110 {
00111 if (bfd_get_error () != bfd_error_system_call)
00112 bfd_set_error (bfd_error_wrong_format);
00113 loser:
00114 bfd_release (abfd, (char *) mergem);
00115 abfd->tdata.any = NULL;
00116 bfd_section_list_clear (abfd);
00117 return 0;
00118 }
00119
00120 set_tdata (abfd, &mergem->coredata);
00121 core_hdr (abfd) = core;
00122
00123
00124 core_regsec (abfd) = bfd_make_section_anyway (abfd, ".reg");
00125 if (core_regsec (abfd) == NULL)
00126 goto loser;
00127
00128 core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
00129 core_regsec (abfd)->size = sizeof (core->cd_regs);
00130 core_regsec (abfd)->vma = (bfd_vma) -1;
00131
00132
00133 core_regsec (abfd)->filepos =
00134 (file_ptr) offsetof (struct corehdr, cd_regs[0]);
00135
00136 core_reg2sec (abfd) = bfd_make_section_anyway (abfd, ".reg2");
00137 if (core_reg2sec (abfd) == NULL)
00138
00139 goto loser;
00140
00141 core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS;
00142 core_reg2sec (abfd)->size = sizeof (core->cd_fpregs);
00143 core_reg2sec (abfd)->vma = (bfd_vma) -1;
00144 core_reg2sec (abfd)->filepos =
00145 (file_ptr) offsetof (struct corehdr, cd_fpregs);
00146
00147 for (i = 0, n = 0; (i < MAX_CORE_SEGS) && (core->cd_segs[i].cs_type); i++)
00148 {
00149 const char *sname;
00150 flagword flags;
00151
00152 if (core->cd_segs[i].cs_offset == 0)
00153 continue;
00154
00155 switch (core->cd_segs[i].cs_type)
00156 {
00157 case COR_TYPE_DATA:
00158 sname = ".data";
00159 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00160 break;
00161 case COR_TYPE_STACK:
00162 sname = ".stack";
00163 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
00164 break;
00165 case COR_TYPE_LIBDATA:
00166 sname = ".libdata";
00167 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00168 break;
00169 case COR_TYPE_WRITE:
00170 sname = ".writeable";
00171 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00172 break;
00173 case COR_TYPE_MSC:
00174 sname = ".misc";
00175 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00176 break;
00177 default:
00178 sname = ".unknown";
00179 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
00180 break;
00181 }
00182 core_section (abfd, n) = bfd_make_section_anyway (abfd, sname);
00183 if (core_section (abfd, n) == NULL)
00184 goto loser;
00185
00186 core_section (abfd, n)->flags = flags;
00187 core_section (abfd, n)->size = core->cd_segs[i].cs_len;
00188 core_section (abfd, n)->vma = core->cd_segs[i].cs_address;
00189 core_section (abfd, n)->filepos = core->cd_segs[i].cs_offset;
00190 core_section (abfd, n)->alignment_power = 2;
00191 n++;
00192 }
00193
00194 return abfd->xvec;
00195 }
00196
00197 static char *
00198 aix386_core_file_failing_command (abfd)
00199 bfd *abfd;
00200 {
00201 return core_hdr (abfd)->cd_comm;
00202 }
00203
00204 static int
00205 aix386_core_file_failing_signal (abfd)
00206 bfd *abfd;
00207 {
00208 return core_hdr (abfd)->cd_cursig;
00209 }
00210
00211 static bfd_boolean
00212 aix386_core_file_matches_executable_p (core_bfd, exec_bfd)
00213 bfd *core_bfd;
00214 bfd *exec_bfd;
00215 {
00216
00217 return TRUE;
00218 }
00219
00220
00221
00222 static void
00223 swap_abort ()
00224 {
00225
00226 abort ();
00227 }
00228
00229 #define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
00230 #define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
00231 #define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
00232 #define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
00233 #define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
00234 #define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
00235
00236 const bfd_target aix386_core_vec = {
00237 "aix386-core",
00238 bfd_target_unknown_flavour,
00239 BFD_ENDIAN_BIG,
00240 BFD_ENDIAN_BIG,
00241 (HAS_RELOC | EXEC_P |
00242 HAS_LINENO | HAS_DEBUG |
00243 HAS_SYMS | HAS_LOCALS | WP_TEXT),
00244
00245 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
00246 0,
00247 ' ',
00248 16,
00249 NO_GET64, NO_GETS64, NO_PUT64,
00250 NO_GET, NO_GETS, NO_PUT,
00251 NO_GET, NO_GETS, NO_PUT,
00252 NO_GET64, NO_GETS64, NO_PUT64,
00253 NO_GET, NO_GETS, NO_PUT,
00254 NO_GET, NO_GETS, NO_PUT,
00255
00256 {_bfd_dummy_target, _bfd_dummy_target,
00257 _bfd_dummy_target, aix386_core_file_p},
00258 {bfd_false, bfd_false,
00259 bfd_false, bfd_false},
00260 {bfd_false, bfd_false,
00261 bfd_false, bfd_false},
00262
00263 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
00264 BFD_JUMP_TABLE_COPY (_bfd_generic),
00265 BFD_JUMP_TABLE_CORE (aix386),
00266 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
00267 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
00268 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
00269 BFD_JUMP_TABLE_WRITE (_bfd_generic),
00270 BFD_JUMP_TABLE_LINK (_bfd_nolink),
00271 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
00272
00273 NULL,
00274
00275 (PTR) 0
00276 };