OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [aoutf1.h] - Blame information for rev 1771

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* A.out "format 1" file handling code for BFD.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000
3
   Free Software Foundation, Inc.
4
   Written by Cygnus Support.
5
 
6
This file is part of BFD, the Binary File Descriptor library.
7
 
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
 
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software
20
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
#include "bfd.h"
23
#include "sysdep.h"
24
#include "libbfd.h"
25
 
26
#include "aout/sun4.h"
27
#include "libaout.h"            /* BFD a.out internal data structures */
28
 
29
#include "aout/aout64.h"
30
#include "aout/stab_gnu.h"
31
#include "aout/ar.h"
32
 
33
/* This is needed to reject a NewsOS file, e.g. in
34
   gdb/testsuite/gdb.t10/crossload.exp. <kingdon@cygnus.com>
35
   I needed to add M_UNKNOWN to recognize a 68000 object, so this will
36
   probably no longer reject a NewsOS object.  <ian@cygnus.com>.  */
37
#ifndef MACHTYPE_OK
38
#define MACHTYPE_OK(mtype) \
39
  (((mtype) == M_SPARC && bfd_lookup_arch (bfd_arch_sparc, 0) != NULL) \
40
   || (((mtype) == M_UNKNOWN || (mtype) == M_68010 || (mtype) == M_68020) \
41
       && bfd_lookup_arch (bfd_arch_m68k, 0) != NULL))
42
#endif
43
 
44
/*
45
The file @code{aoutf1.h} contains the code for BFD's
46
a.out back end. Control over the generated back end is given by these
47
two preprocessor names:
48
@table @code
49
@item ARCH_SIZE
50
This value should be either 32 or 64, depending upon the size of an
51
int in the target format. It changes the sizes of the structs which
52
perform the memory/disk mapping of structures.
53
 
54
The 64 bit backend may only be used if the host compiler supports 64
55
ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}.
56
With this name defined, @emph{all} bfd operations are performed with 64bit
57
arithmetic, not just those to a 64bit target.
58
 
59
@item TARGETNAME
60
The name put into the target vector.
61
@item
62
@end table
63
 
64
*/
65
 
66
/*SUPPRESS558*/
67
/*SUPPRESS529*/
68
 
69
#if ARCH_SIZE == 64
70
#define sunos_set_arch_mach sunos_64_set_arch_mach
71
#define sunos_write_object_contents aout_64_sunos4_write_object_contents
72
#else
73
#define sunos_set_arch_mach sunos_32_set_arch_mach
74
#define sunos_write_object_contents aout_32_sunos4_write_object_contents
75
#endif
76
 
77
static boolean sunos_merge_private_bfd_data PARAMS ((bfd *, bfd *));
78
static void sunos_set_arch_mach PARAMS ((bfd *, int));
79
static void choose_reloc_size PARAMS ((bfd *));
80
static boolean sunos_write_object_contents PARAMS ((bfd *));
81
static const bfd_target *sunos4_core_file_p PARAMS ((bfd *));
82
static char *sunos4_core_file_failing_command PARAMS ((bfd *));
83
static int sunos4_core_file_failing_signal PARAMS ((bfd *));
84
static boolean sunos4_core_file_matches_executable_p PARAMS ((bfd *, bfd *));
85
static boolean sunos4_set_sizes PARAMS ((bfd *));
86
 
87
/* Merge backend data into the output file.
88
   This is necessary on sparclet-aout where we want the resultant machine
89
   number to be M_SPARCLET if any input file is M_SPARCLET.  */
90
 
91
#define MY_bfd_merge_private_bfd_data sunos_merge_private_bfd_data
92
 
93
static boolean
94
sunos_merge_private_bfd_data (ibfd, obfd)
95
     bfd *ibfd, *obfd;
96
{
97
  if (bfd_get_flavour (ibfd) != bfd_target_aout_flavour
98
      || bfd_get_flavour (obfd) != bfd_target_aout_flavour)
99
    return true;
100
 
101
  if (bfd_get_arch (obfd) == bfd_arch_sparc)
102
    {
103
      if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
104
        bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
105
    }
106
 
107
  return true;
108
}
109
 
110
/* This is either sunos_32_set_arch_mach or sunos_64_set_arch_mach,
111
   depending upon ARCH_SIZE.  */
112
 
113
static void
114
sunos_set_arch_mach (abfd, machtype)
115
     bfd *abfd;
116
     int machtype;
117
{
118
  /* Determine the architecture and machine type of the object file.  */
119
  enum bfd_architecture arch;
120
  long machine;
121
  switch (machtype)
122
    {
123
 
124
    case M_UNKNOWN:
125
      /* Some Sun3s make magic numbers without cpu types in them, so
126
         we'll default to the 68000.  */
127
      arch = bfd_arch_m68k;
128
      machine = bfd_mach_m68000;
129
      break;
130
 
131
    case M_68010:
132
    case M_HP200:
133
      arch = bfd_arch_m68k;
134
      machine = bfd_mach_m68010;
135
      break;
136
 
137
    case M_68020:
138
    case M_HP300:
139
      arch = bfd_arch_m68k;
140
      machine = bfd_mach_m68020;
141
      break;
142
 
143
    case M_SPARC:
144
      arch = bfd_arch_sparc;
145
      machine = 0;
146
      break;
147
 
148
    case M_SPARCLET:
149
      arch = bfd_arch_sparc;
150
      machine = bfd_mach_sparc_sparclet;
151
      break;
152
 
153
    case M_SPARCLITE_LE:
154
      arch = bfd_arch_sparc;
155
      machine = bfd_mach_sparc_sparclite_le;
156
      break;
157
 
158
    case M_386:
159
    case M_386_DYNIX:
160
      arch = bfd_arch_i386;
161
      machine = 0;
162
      break;
163
 
164
    case M_29K:
165
      arch = bfd_arch_a29k;
166
      machine = 0;
167
      break;
168
 
169
    case M_HPUX:
170
      arch = bfd_arch_m68k;
171
      machine = 0;
172
      break;
173
 
174
    default:
175
      arch = bfd_arch_obscure;
176
      machine = 0;
177
      break;
178
    }
179
  bfd_set_arch_mach (abfd, arch, machine);
180
}
181
 
182
#define SET_ARCH_MACH(ABFD, EXEC) \
183
  NAME(sunos,set_arch_mach) (ABFD, N_MACHTYPE (EXEC)); \
184
  choose_reloc_size(ABFD);
185
 
186
/* Determine the size of a relocation entry, based on the architecture */
187
static void
188
choose_reloc_size (abfd)
189
     bfd *abfd;
190
{
191
  switch (bfd_get_arch (abfd))
192
    {
193
    case bfd_arch_sparc:
194
    case bfd_arch_a29k:
195
      obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
196
      break;
197
    default:
198
      obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
199
      break;
200
    }
201
}
202
 
203
/* Write an object file in SunOS format.  Section contents have
204
   already been written.  We write the file header, symbols, and
205
   relocation.  The real name of this function is either
206
   aout_64_sunos4_write_object_contents or
207
   aout_32_sunos4_write_object_contents, depending upon ARCH_SIZE.  */
208
 
209
static boolean
210
sunos_write_object_contents (abfd)
211
     bfd *abfd;
212
{
213
  struct external_exec exec_bytes;
214
  struct internal_exec *execp = exec_hdr (abfd);
215
 
216
  /* Magic number, maestro, please!  */
217
  switch (bfd_get_arch (abfd))
218
    {
219
    case bfd_arch_m68k:
220
      switch (bfd_get_mach (abfd))
221
        {
222
        case bfd_mach_m68000:
223
          N_SET_MACHTYPE (*execp, M_UNKNOWN);
224
          break;
225
        case bfd_mach_m68010:
226
          N_SET_MACHTYPE (*execp, M_68010);
227
          break;
228
        default:
229
        case bfd_mach_m68020:
230
          N_SET_MACHTYPE (*execp, M_68020);
231
          break;
232
        }
233
      break;
234
    case bfd_arch_sparc:
235
      switch (bfd_get_mach (abfd))
236
        {
237
        case bfd_mach_sparc_sparclet:
238
          N_SET_MACHTYPE (*execp, M_SPARCLET);
239
          break;
240
        case bfd_mach_sparc_sparclite_le:
241
          N_SET_MACHTYPE (*execp, M_SPARCLITE_LE);
242
          break;
243
        default:
244
          N_SET_MACHTYPE (*execp, M_SPARC);
245
          break;
246
        }
247
      break;
248
    case bfd_arch_i386:
249
      N_SET_MACHTYPE (*execp, M_386);
250
      break;
251
    case bfd_arch_a29k:
252
      N_SET_MACHTYPE (*execp, M_29K);
253
      break;
254
    default:
255
      N_SET_MACHTYPE (*execp, M_UNKNOWN);
256
    }
257
 
258
  choose_reloc_size (abfd);
259
 
260
  N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
261
 
262
  N_SET_DYNAMIC (*execp, bfd_get_file_flags (abfd) & DYNAMIC);
263
 
264
  WRITE_HEADERS (abfd, execp);
265
 
266
  return true;
267
}
268
 
269
/* core files */
270
 
271
#define CORE_MAGIC 0x080456
272
#define CORE_NAMELEN 16
273
 
274
/* The core structure is taken from the Sun documentation.
275
  Unfortunately, they don't document the FPA structure, or at least I
276
  can't find it easily.  Fortunately the core header contains its own
277
  length.  So this shouldn't cause problems, except for c_ucode, which
278
  so far we don't use but is easy to find with a little arithmetic.  */
279
 
280
/* But the reg structure can be gotten from the SPARC processor handbook.
281
  This really should be in a GNU include file though so that gdb can use
282
  the same info.  */
283
struct regs
284
{
285
  int r_psr;
286
  int r_pc;
287
  int r_npc;
288
  int r_y;
289
  int r_g1;
290
  int r_g2;
291
  int r_g3;
292
  int r_g4;
293
  int r_g5;
294
  int r_g6;
295
  int r_g7;
296
  int r_o0;
297
  int r_o1;
298
  int r_o2;
299
  int r_o3;
300
  int r_o4;
301
  int r_o5;
302
  int r_o6;
303
  int r_o7;
304
};
305
 
306
/* Taken from Sun documentation: */
307
 
308
/* FIXME:  It's worse than we expect.  This struct contains TWO substructs
309
  neither of whose size we know, WITH STUFF IN BETWEEN THEM!  We can't
310
  even portably access the stuff in between!  */
311
 
312
struct external_sparc_core
313
  {
314
    int c_magic;                /* Corefile magic number */
315
    int c_len;                  /* Sizeof (struct core) */
316
#define SPARC_CORE_LEN  432
317
    int c_regs[19];             /* General purpose registers -- MACHDEP SIZE */
318
    struct external_exec c_aouthdr;     /* A.out header */
319
    int c_signo;                /* Killing signal, if any */
320
    int c_tsize;                /* Text size (bytes) */
321
    int c_dsize;                /* Data size (bytes) */
322
    int c_ssize;                /* Stack size (bytes) */
323
    char c_cmdname[CORE_NAMELEN + 1];   /* Command name */
324
    double fp_stuff[1];         /* external FPU state (size unknown by us) */
325
    /* The type "double" is critical here, for alignment.
326
    SunOS declares a struct here, but the struct's alignment
327
      is double since it contains doubles.  */
328
    int c_ucode;                /* Exception no. from u_code */
329
    /* (this member is not accessible by name since we don't
330
    portably know the size of fp_stuff.) */
331
  };
332
 
333
/* Core files generated by the BCP (the part of Solaris which allows
334
   it to run SunOS4 a.out files).  */
335
struct external_solaris_bcp_core
336
  {
337
    int c_magic;                /* Corefile magic number */
338
    int c_len;                  /* Sizeof (struct core) */
339
#define SOLARIS_BCP_CORE_LEN    456
340
    int c_regs[19];             /* General purpose registers -- MACHDEP SIZE */
341
    int c_exdata_vp;            /* exdata structure */
342
    int c_exdata_tsize;
343
    int c_exdata_dsize;
344
    int c_exdata_bsize;
345
    int c_exdata_lsize;
346
    int c_exdata_nshlibs;
347
    short c_exdata_mach;
348
    short c_exdata_mag;
349
    int c_exdata_toffset;
350
    int c_exdata_doffset;
351
    int c_exdata_loffset;
352
    int c_exdata_txtorg;
353
    int c_exdata_datorg;
354
    int c_exdata_entloc;
355
    int c_signo;                /* Killing signal, if any */
356
    int c_tsize;                /* Text size (bytes) */
357
    int c_dsize;                /* Data size (bytes) */
358
    int c_ssize;                /* Stack size (bytes) */
359
    char c_cmdname[CORE_NAMELEN + 1];   /* Command name */
360
    double fp_stuff[1];         /* external FPU state (size unknown by us) */
361
    /* The type "double" is critical here, for alignment.
362
    SunOS declares a struct here, but the struct's alignment
363
      is double since it contains doubles.  */
364
    int c_ucode;                /* Exception no. from u_code */
365
    /* (this member is not accessible by name since we don't
366
    portably know the size of fp_stuff.) */
367
  };
368
 
369
struct external_sun3_core
370
  {
371
    int c_magic;                /* Corefile magic number */
372
    int c_len;                  /* Sizeof (struct core) */
373
#define SUN3_CORE_LEN   826     /* As of SunOS 4.1.1 */
374
    int c_regs[18];             /* General purpose registers -- MACHDEP SIZE */
375
    struct external_exec c_aouthdr;     /* A.out header */
376
    int c_signo;                /* Killing signal, if any */
377
    int c_tsize;                /* Text size (bytes) */
378
    int c_dsize;                /* Data size (bytes) */
379
    int c_ssize;                /* Stack size (bytes) */
380
    char c_cmdname[CORE_NAMELEN + 1];   /* Command name */
381
    double fp_stuff[1];         /* external FPU state (size unknown by us) */
382
    /* The type "double" is critical here, for alignment.
383
    SunOS declares a struct here, but the struct's alignment
384
      is double since it contains doubles.  */
385
    int c_ucode;                /* Exception no. from u_code */
386
    /* (this member is not accessible by name since we don't
387
    portably know the size of fp_stuff.) */
388
  };
389
 
390
struct internal_sunos_core
391
  {
392
    int c_magic;                /* Corefile magic number */
393
    int c_len;                  /* Sizeof (struct core) */
394
    long c_regs_pos;            /* file offset of General purpose registers */
395
    int c_regs_size;            /* size of General purpose registers */
396
    struct internal_exec c_aouthdr;     /* A.out header */
397
    int c_signo;                /* Killing signal, if any */
398
    int c_tsize;                /* Text size (bytes) */
399
    int c_dsize;                /* Data size (bytes) */
400
    bfd_vma c_data_addr;        /* Data start (address) */
401
    int c_ssize;                /* Stack size (bytes) */
402
    bfd_vma c_stacktop;         /* Stack top (address) */
403
    char c_cmdname[CORE_NAMELEN + 1];   /* Command name */
404
    long fp_stuff_pos;          /* file offset of external FPU state (regs) */
405
    int fp_stuff_size;          /* Size of it */
406
    int c_ucode;                /* Exception no. from u_code */
407
  };
408
 
409
static void swapcore_sun3
410
  PARAMS ((bfd *, char *, struct internal_sunos_core *));
411
static void swapcore_sparc
412
  PARAMS ((bfd *, char *, struct internal_sunos_core *));
413
static void swapcore_solaris_bcp
414
  PARAMS ((bfd *, char *, struct internal_sunos_core *));
415
 
416
/* byte-swap in the Sun-3 core structure */
417
static void
418
swapcore_sun3 (abfd, ext, intcore)
419
     bfd *abfd;
420
     char *ext;
421
     struct internal_sunos_core *intcore;
422
{
423
  struct external_sun3_core *extcore = (struct external_sun3_core *) ext;
424
 
425
  intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic);
426
  intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len);
427
  intcore->c_regs_pos = (long) (((struct external_sun3_core *) 0)->c_regs);
428
  intcore->c_regs_size = sizeof (extcore->c_regs);
429
#if ARCH_SIZE == 64
430
  aout_64_swap_exec_header_in
431
#else
432
  aout_32_swap_exec_header_in
433
#endif
434
    (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
435
  intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo);
436
  intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize);
437
  intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize);
438
  intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr);
439
  intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize);
440
  memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
441
  intcore->fp_stuff_pos = (long) (((struct external_sun3_core *) 0)->fp_stuff);
442
  /* FP stuff takes up whole rest of struct, except c_ucode.  */
443
  intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
444
    (file_ptr) (((struct external_sun3_core *) 0)->fp_stuff);
445
  /* Ucode is the last thing in the struct -- just before the end */
446
  intcore->c_ucode =
447
    bfd_h_get_32 (abfd,
448
    intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore);
449
  intcore->c_stacktop = 0x0E000000;     /* By experimentation */
450
}
451
 
452
/* byte-swap in the Sparc core structure */
453
static void
454
swapcore_sparc (abfd, ext, intcore)
455
     bfd *abfd;
456
     char *ext;
457
     struct internal_sunos_core *intcore;
458
{
459
  struct external_sparc_core *extcore = (struct external_sparc_core *) ext;
460
 
461
  intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic);
462
  intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len);
463
  intcore->c_regs_pos = (long) (((struct external_sparc_core *) 0)->c_regs);
464
  intcore->c_regs_size = sizeof (extcore->c_regs);
465
#if ARCH_SIZE == 64
466
  aout_64_swap_exec_header_in
467
#else
468
  aout_32_swap_exec_header_in
469
#endif
470
    (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
471
  intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo);
472
  intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize);
473
  intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize);
474
  intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr);
475
  intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize);
476
  memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
477
  intcore->fp_stuff_pos = (long) (((struct external_sparc_core *) 0)->fp_stuff);
478
  /* FP stuff takes up whole rest of struct, except c_ucode.  */
479
  intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
480
    (file_ptr) (((struct external_sparc_core *) 0)->fp_stuff);
481
  /* Ucode is the last thing in the struct -- just before the end */
482
  intcore->c_ucode =
483
    bfd_h_get_32 (abfd,
484
    intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore);
485
 
486
  /* Supposedly the user stack grows downward from the bottom of kernel memory.
487
     Presuming that this remains true, this definition will work.  */
488
  /* Now sun has provided us with another challenge.  The value is different
489
     for sparc2 and sparc10 (both running SunOS 4.1.3).  We pick one or
490
     the other based on the current value of the stack pointer.  This
491
     loses (a) if the stack pointer has been clobbered, or (b) if the stack
492
     is larger than 128 megabytes.
493
 
494
     It's times like these you're glad they're switching to ELF.
495
 
496
     Note that using include files or nlist on /vmunix would be wrong,
497
     because we want the value for this core file, no matter what kind of
498
     machine we were compiled on or are running on.  */
499
#define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
500
#define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
501
  {
502
    bfd_vma sp = bfd_h_get_32
503
    (abfd, (unsigned char *) &((struct regs *) &extcore->c_regs[0])->r_o6);
504
    if (sp < SPARC_USRSTACK_SPARC10)
505
      intcore->c_stacktop = SPARC_USRSTACK_SPARC10;
506
    else
507
      intcore->c_stacktop = SPARC_USRSTACK_SPARC2;
508
  }
509
}
510
 
511
/* byte-swap in the Solaris BCP core structure */
512
static void
513
swapcore_solaris_bcp (abfd, ext, intcore)
514
     bfd *abfd;
515
     char *ext;
516
     struct internal_sunos_core *intcore;
517
{
518
  struct external_solaris_bcp_core *extcore =
519
    (struct external_solaris_bcp_core *) ext;
520
 
521
  intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic);
522
  intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len);
523
  intcore->c_regs_pos = (long) (((struct external_solaris_bcp_core *) 0)->c_regs);
524
  intcore->c_regs_size = sizeof (extcore->c_regs);
525
 
526
  /* The Solaris BCP exdata structure does not contain an a_syms field,
527
     so we are unable to synthesize an internal exec header.
528
     Luckily we are able to figure out the start address of the data section,
529
     which is the only thing needed from the internal exec header,
530
     from the exdata structure.
531
 
532
     As of Solaris 2.3, BCP core files for statically linked executables
533
     are buggy. The exdata structure is not properly filled in, and
534
     the data section is written from address zero instead of the data
535
     start address.  */
536
  memset ((PTR) &intcore->c_aouthdr, 0, sizeof (struct internal_exec));
537
  intcore->c_data_addr =
538
    bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_exdata_datorg);
539
  intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo);
540
  intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize);
541
  intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize);
542
  intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize);
543
  memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
544
  intcore->fp_stuff_pos =
545
    (long) (((struct external_solaris_bcp_core *) 0)->fp_stuff);
546
  /* FP stuff takes up whole rest of struct, except c_ucode.  */
547
  intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
548
    (file_ptr) (((struct external_solaris_bcp_core *) 0)->fp_stuff);
549
  /* Ucode is the last thing in the struct -- just before the end */
550
  intcore->c_ucode =
551
    bfd_h_get_32 (abfd,
552
    intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore);
553
 
554
  /* Supposedly the user stack grows downward from the bottom of kernel memory.
555
     Presuming that this remains true, this definition will work.  */
556
  /* Now sun has provided us with another challenge.  The value is different
557
     for sparc2 and sparc10 (both running SunOS 4.1.3).  We pick one or
558
     the other based on the current value of the stack pointer.  This
559
     loses (a) if the stack pointer has been clobbered, or (b) if the stack
560
     is larger than 128 megabytes.
561
 
562
     It's times like these you're glad they're switching to ELF.
563
 
564
     Note that using include files or nlist on /vmunix would be wrong,
565
     because we want the value for this core file, no matter what kind of
566
     machine we were compiled on or are running on.  */
567
#define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
568
#define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
569
  {
570
    bfd_vma sp = bfd_h_get_32
571
    (abfd, (unsigned char *) &((struct regs *) &extcore->c_regs[0])->r_o6);
572
    if (sp < SPARC_USRSTACK_SPARC10)
573
      intcore->c_stacktop = SPARC_USRSTACK_SPARC10;
574
    else
575
      intcore->c_stacktop = SPARC_USRSTACK_SPARC2;
576
  }
577
}
578
 
579
/* need this cast because ptr is really void * */
580
#define core_hdr(bfd) ((bfd)->tdata.sun_core_data)
581
#define core_datasec(bfd) (core_hdr(bfd)->data_section)
582
#define core_stacksec(bfd) (core_hdr(bfd)->stack_section)
583
#define core_regsec(bfd) (core_hdr(bfd)->reg_section)
584
#define core_reg2sec(bfd) (core_hdr(bfd)->reg2_section)
585
 
586
/* These are stored in the bfd's tdata */
587
struct sun_core_struct
588
{
589
  struct internal_sunos_core *hdr;      /* core file header */
590
  asection *data_section;
591
  asection *stack_section;
592
  asection *reg_section;
593
  asection *reg2_section;
594
};
595
 
596
static const bfd_target *
597
sunos4_core_file_p (abfd)
598
     bfd *abfd;
599
{
600
  unsigned char longbuf[4];     /* Raw bytes of various header fields */
601
  bfd_size_type core_size;
602
  unsigned long core_mag;
603
  struct internal_sunos_core *core;
604
  char *extcore;
605
  struct mergem
606
    {
607
      struct sun_core_struct suncoredata;
608
      struct internal_sunos_core internal_sunos_core;
609
      char external_core[1];
610
    }
611
   *mergem;
612
 
613
  if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) !=
614
      sizeof (longbuf))
615
    return 0;
616
  core_mag = bfd_h_get_32 (abfd, longbuf);
617
 
618
  if (core_mag != CORE_MAGIC)
619
    return 0;
620
 
621
  /* SunOS core headers can vary in length; second word is size; */
622
  if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) !=
623
      sizeof (longbuf))
624
    return 0;
625
  core_size = bfd_h_get_32 (abfd, longbuf);
626
  /* Sanity check */
627
  if (core_size > 20000)
628
    return 0;
629
 
630
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0)
631
    return 0;
632
 
633
  mergem = (struct mergem *) bfd_zalloc (abfd, core_size + sizeof (struct mergem));
634
  if (mergem == NULL)
635
    return 0;
636
 
637
  extcore = mergem->external_core;
638
 
639
  if ((bfd_read ((PTR) extcore, 1, core_size, abfd)) != core_size)
640
    {
641
      bfd_release (abfd, (char *) mergem);
642
      return 0;
643
    }
644
 
645
  /* Validate that it's a core file we know how to handle, due to sun
646
     botching the positioning of registers and other fields in a machine
647
     dependent way.  */
648
  core = &mergem->internal_sunos_core;
649
  switch (core_size)
650
    {
651
    case SPARC_CORE_LEN:
652
      swapcore_sparc (abfd, extcore, core);
653
      break;
654
    case SUN3_CORE_LEN:
655
      swapcore_sun3 (abfd, extcore, core);
656
      break;
657
    case SOLARIS_BCP_CORE_LEN:
658
      swapcore_solaris_bcp (abfd, extcore, core);
659
      break;
660
    default:
661
      bfd_set_error (bfd_error_system_call);    /* FIXME */
662
      bfd_release (abfd, (char *) mergem);
663
      return 0;
664
    }
665
 
666
  abfd->tdata.sun_core_data = &mergem->suncoredata;
667
  abfd->tdata.sun_core_data->hdr = core;
668
 
669
  /* create the sections.  This is raunchy, but bfd_close wants to reclaim
670
     them */
671
  core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
672
  if (core_stacksec (abfd) == NULL)
673
    {
674
    loser:
675
      bfd_release (abfd, (char *) mergem);
676
      return 0;
677
    }
678
  core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
679
  if (core_datasec (abfd) == NULL)
680
    {
681
    loser1:
682
      bfd_release (abfd, core_stacksec (abfd));
683
      goto loser;
684
    }
685
  core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
686
  if (core_regsec (abfd) == NULL)
687
    {
688
    loser2:
689
      bfd_release (abfd, core_datasec (abfd));
690
      goto loser1;
691
    }
692
  core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
693
  if (core_reg2sec (abfd) == NULL)
694
    {
695
      bfd_release (abfd, core_regsec (abfd));
696
      goto loser2;
697
    }
698
 
699
  core_stacksec (abfd)->name = ".stack";
700
  core_datasec (abfd)->name = ".data";
701
  core_regsec (abfd)->name = ".reg";
702
  core_reg2sec (abfd)->name = ".reg2";
703
 
704
  core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
705
  core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
706
  core_regsec (abfd)->flags = SEC_HAS_CONTENTS;
707
  core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS;
708
 
709
  core_stacksec (abfd)->_raw_size = core->c_ssize;
710
  core_datasec (abfd)->_raw_size = core->c_dsize;
711
  core_regsec (abfd)->_raw_size = core->c_regs_size;
712
  core_reg2sec (abfd)->_raw_size = core->fp_stuff_size;
713
 
714
  core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize);
715
  core_datasec (abfd)->vma = core->c_data_addr;
716
  core_regsec (abfd)->vma = 0;
717
  core_reg2sec (abfd)->vma = 0;
718
 
719
  core_stacksec (abfd)->filepos = core->c_len + core->c_dsize;
720
  core_datasec (abfd)->filepos = core->c_len;
721
  /* We'll access the regs afresh in the core file, like any section: */
722
  core_regsec (abfd)->filepos = (file_ptr) core->c_regs_pos;
723
  core_reg2sec (abfd)->filepos = (file_ptr) core->fp_stuff_pos;
724
 
725
  /* Align to word at least */
726
  core_stacksec (abfd)->alignment_power = 2;
727
  core_datasec (abfd)->alignment_power = 2;
728
  core_regsec (abfd)->alignment_power = 2;
729
  core_reg2sec (abfd)->alignment_power = 2;
730
 
731
  abfd->sections = core_stacksec (abfd);
732
  core_stacksec (abfd)->next = core_datasec (abfd);
733
  core_datasec (abfd)->next = core_regsec (abfd);
734
  core_regsec (abfd)->next = core_reg2sec (abfd);
735
 
736
  abfd->section_count = 4;
737
 
738
  return abfd->xvec;
739
}
740
 
741
static char *
742
sunos4_core_file_failing_command (abfd)
743
     bfd *abfd;
744
{
745
  return core_hdr (abfd)->hdr->c_cmdname;
746
}
747
 
748
static int
749
sunos4_core_file_failing_signal (abfd)
750
     bfd *abfd;
751
{
752
  return core_hdr (abfd)->hdr->c_signo;
753
}
754
 
755
static boolean
756
sunos4_core_file_matches_executable_p (core_bfd, exec_bfd)
757
     bfd *core_bfd;
758
     bfd *exec_bfd;
759
{
760
  if (core_bfd->xvec != exec_bfd->xvec)
761
    {
762
      bfd_set_error (bfd_error_system_call);
763
      return false;
764
    }
765
 
766
  /* Solaris core files do not include an aouthdr.  */
767
  if ((core_hdr (core_bfd)->hdr)->c_len == SOLARIS_BCP_CORE_LEN)
768
    return true;
769
 
770
  return (memcmp ((char *) &((core_hdr (core_bfd)->hdr)->c_aouthdr),
771
                  (char *) exec_hdr (exec_bfd),
772
                  sizeof (struct internal_exec)) == 0) ? true : false;
773
}
774
 
775
#define MY_set_sizes sunos4_set_sizes
776
static boolean
777
sunos4_set_sizes (abfd)
778
     bfd *abfd;
779
{
780
  switch (bfd_get_arch (abfd))
781
    {
782
    default:
783
      return false;
784
    case bfd_arch_sparc:
785
      adata (abfd).page_size = 0x2000;
786
      adata (abfd).segment_size = 0x2000;
787
      adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
788
      return true;
789
    case bfd_arch_m68k:
790
      adata (abfd).page_size = 0x2000;
791
      adata (abfd).segment_size = 0x20000;
792
      adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
793
      return true;
794
    }
795
}
796
 
797
/* We default to setting the toolversion field to 1, as is required by
798
   SunOS.  */
799
#ifndef MY_exec_hdr_flags
800
#define MY_exec_hdr_flags 1
801
#endif
802
 
803
#ifndef MY_entry_is_text_address
804
#define MY_entry_is_text_address 0
805
#endif
806
#ifndef MY_add_dynamic_symbols
807
#define MY_add_dynamic_symbols 0
808
#endif
809
#ifndef MY_add_one_symbol
810
#define MY_add_one_symbol 0
811
#endif
812
#ifndef MY_link_dynamic_object
813
#define MY_link_dynamic_object 0
814
#endif
815
#ifndef MY_write_dynamic_symbol
816
#define MY_write_dynamic_symbol 0
817
#endif
818
#ifndef MY_check_dynamic_reloc
819
#define MY_check_dynamic_reloc 0
820
#endif
821
#ifndef MY_finish_dynamic_link
822
#define MY_finish_dynamic_link 0
823
#endif
824
 
825
static CONST struct aout_backend_data sunos4_aout_backend =
826
{
827
  0,                             /* zmagic files are not contiguous */
828
  1,                            /* text includes header */
829
  MY_entry_is_text_address,
830
  MY_exec_hdr_flags,
831
  0,                             /* default text vma */
832
  sunos4_set_sizes,
833
  0,                             /* header is counted in zmagic text */
834
  MY_add_dynamic_symbols,
835
  MY_add_one_symbol,
836
  MY_link_dynamic_object,
837
  MY_write_dynamic_symbol,
838
  MY_check_dynamic_reloc,
839
  MY_finish_dynamic_link
840
};
841
 
842
#define MY_core_file_failing_command    sunos4_core_file_failing_command
843
#define MY_core_file_failing_signal     sunos4_core_file_failing_signal
844
#define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p
845
 
846
#define MY_bfd_debug_info_start         bfd_void
847
#define MY_bfd_debug_info_end           bfd_void
848
#define MY_bfd_debug_info_accumulate    \
849
                        (void (*) PARAMS ((bfd *, struct sec *))) bfd_void
850
#define MY_core_file_p                  sunos4_core_file_p
851
#define MY_write_object_contents        NAME(aout,sunos4_write_object_contents)
852
#define MY_backend_data                 &sunos4_aout_backend
853
 
854
#ifndef TARGET_IS_LITTLE_ENDIAN_P
855
#define TARGET_IS_BIG_ENDIAN_P
856
#endif
857
 
858
#include "aout-target.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.