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