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, 2004, 2005
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
27 #include "aout/sun4.h"
28 #include "libaout.h" /* BFD a.out internal data structures. */
30 #include "aout/aout64.h"
31 #include "aout/stab_gnu.h"
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>. */
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))
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:
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.
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.
60 The name put into the target vector.
65 #define sunos_set_arch_mach sunos_64_set_arch_mach
66 #define sunos_write_object_contents aout_64_sunos4_write_object_contents
68 #define sunos_set_arch_mach sunos_32_set_arch_mach
69 #define sunos_write_object_contents aout_32_sunos4_write_object_contents
72 /* Merge backend data into the output file.
73 This is necessary on sparclet-aout where we want the resultant machine
74 number to be M_SPARCLET if any input file is M_SPARCLET. */
76 #define MY_bfd_merge_private_bfd_data sunos_merge_private_bfd_data
79 sunos_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
81 if (bfd_get_flavour (ibfd
) != bfd_target_aout_flavour
82 || bfd_get_flavour (obfd
) != bfd_target_aout_flavour
)
85 if (bfd_get_arch (obfd
) == bfd_arch_sparc
)
87 if (bfd_get_mach (obfd
) < bfd_get_mach (ibfd
))
88 bfd_set_arch_mach (obfd
, bfd_arch_sparc
, bfd_get_mach (ibfd
));
94 /* This is either sunos_32_set_arch_mach or sunos_64_set_arch_mach,
95 depending upon ARCH_SIZE. */
98 sunos_set_arch_mach (bfd
*abfd
, enum machine_type machtype
)
100 /* Determine the architecture and machine type of the object file. */
101 enum bfd_architecture arch
;
102 unsigned long machine
;
107 /* Some Sun3s make magic numbers without cpu types in them, so
108 we'll default to the 68000. */
109 arch
= bfd_arch_m68k
;
110 machine
= bfd_mach_m68000
;
115 arch
= bfd_arch_m68k
;
116 machine
= bfd_mach_m68010
;
121 arch
= bfd_arch_m68k
;
122 machine
= bfd_mach_m68020
;
126 arch
= bfd_arch_sparc
;
131 arch
= bfd_arch_sparc
;
132 machine
= bfd_mach_sparc_sparclet
;
136 arch
= bfd_arch_sparc
;
137 machine
= bfd_mach_sparc_sparclite_le
;
142 arch
= bfd_arch_i386
;
147 arch
= bfd_arch_m68k
;
152 arch
= bfd_arch_obscure
;
156 bfd_set_arch_mach (abfd
, arch
, machine
);
159 #define SET_ARCH_MACH(ABFD, EXEC) \
160 NAME(sunos,set_arch_mach) (ABFD, N_MACHTYPE (EXEC)); \
161 choose_reloc_size(ABFD);
163 /* Determine the size of a relocation entry, based on the architecture. */
166 choose_reloc_size (bfd
*abfd
)
168 switch (bfd_get_arch (abfd
))
171 obj_reloc_entry_size (abfd
) = RELOC_EXT_SIZE
;
174 obj_reloc_entry_size (abfd
) = RELOC_STD_SIZE
;
179 /* Write an object file in SunOS format. Section contents have
180 already been written. We write the file header, symbols, and
181 relocation. The real name of this function is either
182 aout_64_sunos4_write_object_contents or
183 aout_32_sunos4_write_object_contents, depending upon ARCH_SIZE. */
186 sunos_write_object_contents (bfd
*abfd
)
188 struct external_exec exec_bytes
;
189 struct internal_exec
*execp
= exec_hdr (abfd
);
191 /* Magic number, maestro, please! */
192 switch (bfd_get_arch (abfd
))
195 switch (bfd_get_mach (abfd
))
197 case bfd_mach_m68000
:
198 N_SET_MACHTYPE (*execp
, M_UNKNOWN
);
200 case bfd_mach_m68010
:
201 N_SET_MACHTYPE (*execp
, M_68010
);
204 case bfd_mach_m68020
:
205 N_SET_MACHTYPE (*execp
, M_68020
);
210 switch (bfd_get_mach (abfd
))
212 case bfd_mach_sparc_sparclet
:
213 N_SET_MACHTYPE (*execp
, M_SPARCLET
);
215 case bfd_mach_sparc_sparclite_le
:
216 N_SET_MACHTYPE (*execp
, M_SPARCLITE_LE
);
219 N_SET_MACHTYPE (*execp
, M_SPARC
);
224 N_SET_MACHTYPE (*execp
, M_386
);
227 N_SET_MACHTYPE (*execp
, M_UNKNOWN
);
230 choose_reloc_size (abfd
);
232 N_SET_FLAGS (*execp
, aout_backend_info (abfd
)->exec_hdr_flags
);
234 N_SET_DYNAMIC (*execp
, (long)(bfd_get_file_flags (abfd
) & DYNAMIC
));
236 WRITE_HEADERS (abfd
, execp
);
243 #define CORE_MAGIC 0x080456
244 #define CORE_NAMELEN 16
246 /* The core structure is taken from the Sun documentation.
247 Unfortunately, they don't document the FPA structure, or at least I
248 can't find it easily. Fortunately the core header contains its own
249 length. So this shouldn't cause problems, except for c_ucode, which
250 so far we don't use but is easy to find with a little arithmetic. */
252 /* But the reg structure can be gotten from the SPARC processor handbook.
253 This really should be in a GNU include file though so that gdb can use
278 /* Taken from Sun documentation: */
280 /* FIXME: It's worse than we expect. This struct contains TWO substructs
281 neither of whose size we know, WITH STUFF IN BETWEEN THEM! We can't
282 even portably access the stuff in between! */
284 struct external_sparc_core
286 int c_magic
; /* Corefile magic number. */
287 int c_len
; /* Sizeof (struct core). */
288 #define SPARC_CORE_LEN 432
289 int c_regs
[19]; /* General purpose registers -- MACHDEP SIZE. */
290 struct external_exec c_aouthdr
; /* A.out header. */
291 int c_signo
; /* Killing signal, if any. */
292 int c_tsize
; /* Text size (bytes). */
293 int c_dsize
; /* Data size (bytes). */
294 int c_ssize
; /* Stack size (bytes). */
295 char c_cmdname
[CORE_NAMELEN
+ 1]; /* Command name. */
296 double fp_stuff
[1]; /* External FPU state (size unknown by us). */
297 /* The type "double" is critical here, for alignment.
298 SunOS declares a struct here, but the struct's
299 alignment is double since it contains doubles. */
300 int c_ucode
; /* Exception no. from u_code. */
301 /* This member is not accessible by name since
302 we don't portably know the size of fp_stuff. */
305 /* Core files generated by the BCP (the part of Solaris which allows
306 it to run SunOS4 a.out files). */
307 struct external_solaris_bcp_core
309 int c_magic
; /* Corefile magic number. */
310 int c_len
; /* Sizeof (struct core). */
311 #define SOLARIS_BCP_CORE_LEN 456
312 int c_regs
[19]; /* General purpose registers -- MACHDEP SIZE. */
313 int c_exdata_vp
; /* Exdata structure. */
318 int c_exdata_nshlibs
;
321 int c_exdata_toffset
;
322 int c_exdata_doffset
;
323 int c_exdata_loffset
;
327 int c_signo
; /* Killing signal, if any. */
328 int c_tsize
; /* Text size (bytes). */
329 int c_dsize
; /* Data size (bytes). */
330 int c_ssize
; /* Stack size (bytes). */
331 char c_cmdname
[CORE_NAMELEN
+ 1]; /* Command name. */
332 double fp_stuff
[1]; /* External FPU state (size unknown by us). */
333 /* The type "double" is critical here, for alignment.
334 SunOS declares a struct here, but the struct's
335 alignment is double since it contains doubles. */
336 int c_ucode
; /* Exception no. from u_code. */
337 /* This member is not accessible by name since
338 we don't portably know the size of fp_stuff. */
341 struct external_sun3_core
343 int c_magic
; /* Corefile magic number. */
344 int c_len
; /* Sizeof (struct core). */
345 #define SUN3_CORE_LEN 826 /* As of SunOS 4.1.1. */
346 int c_regs
[18]; /* General purpose registers -- MACHDEP SIZE. */
347 struct external_exec c_aouthdr
; /* A.out header. */
348 int c_signo
; /* Killing signal, if any. */
349 int c_tsize
; /* Text size (bytes). */
350 int c_dsize
; /* Data size (bytes). */
351 int c_ssize
; /* Stack size (bytes). */
352 char c_cmdname
[CORE_NAMELEN
+ 1]; /* Command name. */
353 double fp_stuff
[1]; /* External FPU state (size unknown by us). */
354 /* The type "double" is critical here, for alignment.
355 SunOS declares a struct here, but the struct's
356 alignment is double since it contains doubles. */
357 int c_ucode
; /* Exception no. from u_code. */
358 /* This member is not accessible by name since
359 we don't portably know the size of fp_stuff. */
362 struct internal_sunos_core
364 int c_magic
; /* Corefile magic number. */
365 int c_len
; /* Sizeof (struct core). */
366 long c_regs_pos
; /* File offset of General purpose registers. */
367 int c_regs_size
; /* Size of General purpose registers. */
368 struct internal_exec c_aouthdr
; /* A.out header. */
369 int c_signo
; /* Killing signal, if any. */
370 int c_tsize
; /* Text size (bytes). */
371 int c_dsize
; /* Data size (bytes). */
372 bfd_vma c_data_addr
; /* Data start (address). */
373 int c_ssize
; /* Stack size (bytes). */
374 bfd_vma c_stacktop
; /* Stack top (address). */
375 char c_cmdname
[CORE_NAMELEN
+ 1]; /* Command name. */
376 long fp_stuff_pos
; /* File offset of external FPU state (regs). */
377 int fp_stuff_size
; /* Size of it. */
378 int c_ucode
; /* Exception no. from u_code. */
381 /* Byte-swap in the Sun-3 core structure. */
384 swapcore_sun3 (bfd
*abfd
, char *ext
, struct internal_sunos_core
*intcore
)
386 struct external_sun3_core
*extcore
= (struct external_sun3_core
*) ext
;
388 intcore
->c_magic
= H_GET_32 (abfd
, &extcore
->c_magic
);
389 intcore
->c_len
= H_GET_32 (abfd
, &extcore
->c_len
);
390 intcore
->c_regs_pos
= (long) (((struct external_sun3_core
*) 0)->c_regs
);
391 intcore
->c_regs_size
= sizeof (extcore
->c_regs
);
393 aout_64_swap_exec_header_in
395 aout_32_swap_exec_header_in
397 (abfd
, &extcore
->c_aouthdr
, &intcore
->c_aouthdr
);
398 intcore
->c_signo
= H_GET_32 (abfd
, &extcore
->c_signo
);
399 intcore
->c_tsize
= H_GET_32 (abfd
, &extcore
->c_tsize
);
400 intcore
->c_dsize
= H_GET_32 (abfd
, &extcore
->c_dsize
);
401 intcore
->c_data_addr
= N_DATADDR (intcore
->c_aouthdr
);
402 intcore
->c_ssize
= H_GET_32 (abfd
, &extcore
->c_ssize
);
403 memcpy (intcore
->c_cmdname
, extcore
->c_cmdname
, sizeof (intcore
->c_cmdname
));
404 intcore
->fp_stuff_pos
= (long) (((struct external_sun3_core
*) 0)->fp_stuff
);
405 /* FP stuff takes up whole rest of struct, except c_ucode. */
406 intcore
->fp_stuff_size
= intcore
->c_len
- (sizeof extcore
->c_ucode
) -
407 (file_ptr
) (((struct external_sun3_core
*) 0)->fp_stuff
);
408 /* Ucode is the last thing in the struct -- just before the end. */
409 intcore
->c_ucode
= H_GET_32 (abfd
,
411 - sizeof (extcore
->c_ucode
)
412 + (unsigned char *) extcore
));
413 intcore
->c_stacktop
= 0x0E000000; /* By experimentation. */
416 /* Byte-swap in the Sparc core structure. */
419 swapcore_sparc (bfd
*abfd
, char *ext
, struct internal_sunos_core
*intcore
)
421 struct external_sparc_core
*extcore
= (struct external_sparc_core
*) ext
;
423 intcore
->c_magic
= H_GET_32 (abfd
, &extcore
->c_magic
);
424 intcore
->c_len
= H_GET_32 (abfd
, &extcore
->c_len
);
425 intcore
->c_regs_pos
= (long) (((struct external_sparc_core
*) 0)->c_regs
);
426 intcore
->c_regs_size
= sizeof (extcore
->c_regs
);
428 aout_64_swap_exec_header_in
430 aout_32_swap_exec_header_in
432 (abfd
, &extcore
->c_aouthdr
, &intcore
->c_aouthdr
);
433 intcore
->c_signo
= H_GET_32 (abfd
, &extcore
->c_signo
);
434 intcore
->c_tsize
= H_GET_32 (abfd
, &extcore
->c_tsize
);
435 intcore
->c_dsize
= H_GET_32 (abfd
, &extcore
->c_dsize
);
436 intcore
->c_data_addr
= N_DATADDR (intcore
->c_aouthdr
);
437 intcore
->c_ssize
= H_GET_32 (abfd
, &extcore
->c_ssize
);
438 memcpy (intcore
->c_cmdname
, extcore
->c_cmdname
, sizeof (intcore
->c_cmdname
));
439 intcore
->fp_stuff_pos
= (long) (((struct external_sparc_core
*) 0)->fp_stuff
);
440 /* FP stuff takes up whole rest of struct, except c_ucode. */
441 intcore
->fp_stuff_size
= intcore
->c_len
- (sizeof extcore
->c_ucode
) -
442 (file_ptr
) (((struct external_sparc_core
*) 0)->fp_stuff
);
443 /* Ucode is the last thing in the struct -- just before the end. */
444 intcore
->c_ucode
= H_GET_32 (abfd
,
446 - sizeof (extcore
->c_ucode
)
447 + (unsigned char *) extcore
));
449 /* Supposedly the user stack grows downward from the bottom of kernel memory.
450 Presuming that this remains true, this definition will work. */
451 /* Now sun has provided us with another challenge. The value is different
452 for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or
453 the other based on the current value of the stack pointer. This
454 loses (a) if the stack pointer has been clobbered, or (b) if the stack
455 is larger than 128 megabytes.
457 It's times like these you're glad they're switching to ELF.
459 Note that using include files or nlist on /vmunix would be wrong,
460 because we want the value for this core file, no matter what kind of
461 machine we were compiled on or are running on. */
462 #define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
463 #define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
465 bfd_vma sp
= H_GET_32 (abfd
, &((struct regs
*) &extcore
->c_regs
[0])->r_o6
);
466 if (sp
< SPARC_USRSTACK_SPARC10
)
467 intcore
->c_stacktop
= SPARC_USRSTACK_SPARC10
;
469 intcore
->c_stacktop
= SPARC_USRSTACK_SPARC2
;
473 /* Byte-swap in the Solaris BCP core structure. */
476 swapcore_solaris_bcp (bfd
*abfd
, char *ext
, struct internal_sunos_core
*intcore
)
478 struct external_solaris_bcp_core
*extcore
=
479 (struct external_solaris_bcp_core
*) ext
;
481 intcore
->c_magic
= H_GET_32 (abfd
, &extcore
->c_magic
);
482 intcore
->c_len
= H_GET_32 (abfd
, &extcore
->c_len
);
483 intcore
->c_regs_pos
= (long) (((struct external_solaris_bcp_core
*) 0)->c_regs
);
484 intcore
->c_regs_size
= sizeof (extcore
->c_regs
);
486 /* The Solaris BCP exdata structure does not contain an a_syms field,
487 so we are unable to synthesize an internal exec header.
488 Luckily we are able to figure out the start address of the data section,
489 which is the only thing needed from the internal exec header,
490 from the exdata structure.
492 As of Solaris 2.3, BCP core files for statically linked executables
493 are buggy. The exdata structure is not properly filled in, and
494 the data section is written from address zero instead of the data
496 memset ((void *) &intcore
->c_aouthdr
, 0, sizeof (struct internal_exec
));
497 intcore
->c_data_addr
= H_GET_32 (abfd
, &extcore
->c_exdata_datorg
);
498 intcore
->c_signo
= H_GET_32 (abfd
, &extcore
->c_signo
);
499 intcore
->c_tsize
= H_GET_32 (abfd
, &extcore
->c_tsize
);
500 intcore
->c_dsize
= H_GET_32 (abfd
, &extcore
->c_dsize
);
501 intcore
->c_ssize
= H_GET_32 (abfd
, &extcore
->c_ssize
);
502 memcpy (intcore
->c_cmdname
, extcore
->c_cmdname
, sizeof (intcore
->c_cmdname
));
503 intcore
->fp_stuff_pos
=
504 (long) (((struct external_solaris_bcp_core
*) 0)->fp_stuff
);
505 /* FP stuff takes up whole rest of struct, except c_ucode. */
506 intcore
->fp_stuff_size
= intcore
->c_len
- (sizeof extcore
->c_ucode
) -
507 (file_ptr
) (((struct external_solaris_bcp_core
*) 0)->fp_stuff
);
508 /* Ucode is the last thing in the struct -- just before the end */
509 intcore
->c_ucode
= H_GET_32 (abfd
,
511 - sizeof (extcore
->c_ucode
)
512 + (unsigned char *) extcore
));
514 /* Supposedly the user stack grows downward from the bottom of kernel memory.
515 Presuming that this remains true, this definition will work. */
516 /* Now sun has provided us with another challenge. The value is different
517 for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or
518 the other based on the current value of the stack pointer. This
519 loses (a) if the stack pointer has been clobbered, or (b) if the stack
520 is larger than 128 megabytes.
522 It's times like these you're glad they're switching to ELF.
524 Note that using include files or nlist on /vmunix would be wrong,
525 because we want the value for this core file, no matter what kind of
526 machine we were compiled on or are running on. */
527 #define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
528 #define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
530 bfd_vma sp
= H_GET_32 (abfd
, &((struct regs
*) &extcore
->c_regs
[0])->r_o6
);
531 if (sp
< SPARC_USRSTACK_SPARC10
)
532 intcore
->c_stacktop
= SPARC_USRSTACK_SPARC10
;
534 intcore
->c_stacktop
= SPARC_USRSTACK_SPARC2
;
538 /* Need this cast because ptr is really void *. */
539 #define core_hdr(bfd) ((bfd)->tdata.sun_core_data)
540 #define core_datasec(bfd) (core_hdr (bfd)->data_section)
541 #define core_stacksec(bfd) (core_hdr (bfd)->stack_section)
542 #define core_regsec(bfd) (core_hdr (bfd)->reg_section)
543 #define core_reg2sec(bfd) (core_hdr (bfd)->reg2_section)
545 /* These are stored in the bfd's tdata. */
546 struct sun_core_struct
548 struct internal_sunos_core
*hdr
; /* Core file header. */
549 asection
*data_section
;
550 asection
*stack_section
;
551 asection
*reg_section
;
552 asection
*reg2_section
;
555 static const bfd_target
*
556 sunos4_core_file_p (bfd
*abfd
)
558 unsigned char longbuf
[4]; /* Raw bytes of various header fields. */
559 bfd_size_type core_size
, amt
;
560 unsigned long core_mag
;
561 struct internal_sunos_core
*core
;
565 struct sun_core_struct suncoredata
;
566 struct internal_sunos_core internal_sunos_core
;
567 char external_core
[1];
570 if (bfd_bread ((void *) longbuf
, (bfd_size_type
) sizeof (longbuf
), abfd
)
573 core_mag
= H_GET_32 (abfd
, longbuf
);
575 if (core_mag
!= CORE_MAGIC
)
578 /* SunOS core headers can vary in length; second word is size; */
579 if (bfd_bread ((void *) longbuf
, (bfd_size_type
) sizeof (longbuf
), abfd
)
582 core_size
= H_GET_32 (abfd
, longbuf
);
584 if (core_size
> 20000)
587 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
590 amt
= core_size
+ sizeof (struct mergem
);
591 mergem
= bfd_zalloc (abfd
, amt
);
595 extcore
= mergem
->external_core
;
597 if ((bfd_bread ((void *) extcore
, core_size
, abfd
)) != core_size
)
600 bfd_release (abfd
, (char *) mergem
);
601 abfd
->tdata
.any
= NULL
;
602 bfd_section_list_clear (abfd
);
606 /* Validate that it's a core file we know how to handle, due to sun
607 botching the positioning of registers and other fields in a machine
609 core
= &mergem
->internal_sunos_core
;
613 swapcore_sparc (abfd
, extcore
, core
);
616 swapcore_sun3 (abfd
, extcore
, core
);
618 case SOLARIS_BCP_CORE_LEN
:
619 swapcore_solaris_bcp (abfd
, extcore
, core
);
622 bfd_set_error (bfd_error_system_call
); /* FIXME. */
626 abfd
->tdata
.sun_core_data
= &mergem
->suncoredata
;
627 abfd
->tdata
.sun_core_data
->hdr
= core
;
629 /* Create the sections. */
630 core_stacksec (abfd
) = bfd_make_section_anyway (abfd
, ".stack");
631 if (core_stacksec (abfd
) == NULL
)
632 /* bfd_release frees everything allocated after it's arg. */
635 core_datasec (abfd
) = bfd_make_section_anyway (abfd
, ".data");
636 if (core_datasec (abfd
) == NULL
)
639 core_regsec (abfd
) = bfd_make_section_anyway (abfd
, ".reg");
640 if (core_regsec (abfd
) == NULL
)
643 core_reg2sec (abfd
) = bfd_make_section_anyway (abfd
, ".reg2");
644 if (core_reg2sec (abfd
) == NULL
)
647 core_stacksec (abfd
)->flags
= SEC_ALLOC
+ SEC_LOAD
+ SEC_HAS_CONTENTS
;
648 core_datasec (abfd
)->flags
= SEC_ALLOC
+ SEC_LOAD
+ SEC_HAS_CONTENTS
;
649 core_regsec (abfd
)->flags
= SEC_HAS_CONTENTS
;
650 core_reg2sec (abfd
)->flags
= SEC_HAS_CONTENTS
;
652 core_stacksec (abfd
)->size
= core
->c_ssize
;
653 core_datasec (abfd
)->size
= core
->c_dsize
;
654 core_regsec (abfd
)->size
= core
->c_regs_size
;
655 core_reg2sec (abfd
)->size
= core
->fp_stuff_size
;
657 core_stacksec (abfd
)->vma
= (core
->c_stacktop
- core
->c_ssize
);
658 core_datasec (abfd
)->vma
= core
->c_data_addr
;
659 core_regsec (abfd
)->vma
= 0;
660 core_reg2sec (abfd
)->vma
= 0;
662 core_stacksec (abfd
)->filepos
= core
->c_len
+ core
->c_dsize
;
663 core_datasec (abfd
)->filepos
= core
->c_len
;
664 /* We'll access the regs afresh in the core file, like any section: */
665 core_regsec (abfd
)->filepos
= (file_ptr
) core
->c_regs_pos
;
666 core_reg2sec (abfd
)->filepos
= (file_ptr
) core
->fp_stuff_pos
;
668 /* Align to word at least. */
669 core_stacksec (abfd
)->alignment_power
= 2;
670 core_datasec (abfd
)->alignment_power
= 2;
671 core_regsec (abfd
)->alignment_power
= 2;
672 core_reg2sec (abfd
)->alignment_power
= 2;
678 sunos4_core_file_failing_command (bfd
*abfd
)
680 return core_hdr (abfd
)->hdr
->c_cmdname
;
684 sunos4_core_file_failing_signal (bfd
*abfd
)
686 return core_hdr (abfd
)->hdr
->c_signo
;
690 sunos4_core_file_matches_executable_p (bfd
*core_bfd
, bfd
*exec_bfd
)
692 if (core_bfd
->xvec
!= exec_bfd
->xvec
)
694 bfd_set_error (bfd_error_system_call
);
698 /* Solaris core files do not include an aouthdr. */
699 if ((core_hdr (core_bfd
)->hdr
)->c_len
== SOLARIS_BCP_CORE_LEN
)
702 return memcmp ((char *) &((core_hdr (core_bfd
)->hdr
)->c_aouthdr
),
703 (char *) exec_hdr (exec_bfd
),
704 sizeof (struct internal_exec
)) == 0;
707 #define MY_set_sizes sunos4_set_sizes
710 sunos4_set_sizes (bfd
*abfd
)
712 switch (bfd_get_arch (abfd
))
717 adata (abfd
).page_size
= 0x2000;
718 adata (abfd
).segment_size
= 0x2000;
719 adata (abfd
).exec_bytes_size
= EXEC_BYTES_SIZE
;
722 adata (abfd
).page_size
= 0x2000;
723 adata (abfd
).segment_size
= 0x20000;
724 adata (abfd
).exec_bytes_size
= EXEC_BYTES_SIZE
;
729 /* We default to setting the toolversion field to 1, as is required by
731 #ifndef MY_exec_hdr_flags
732 #define MY_exec_hdr_flags 1
735 #ifndef MY_entry_is_text_address
736 #define MY_entry_is_text_address 0
738 #ifndef MY_add_dynamic_symbols
739 #define MY_add_dynamic_symbols 0
741 #ifndef MY_add_one_symbol
742 #define MY_add_one_symbol 0
744 #ifndef MY_link_dynamic_object
745 #define MY_link_dynamic_object 0
747 #ifndef MY_write_dynamic_symbol
748 #define MY_write_dynamic_symbol 0
750 #ifndef MY_check_dynamic_reloc
751 #define MY_check_dynamic_reloc 0
753 #ifndef MY_finish_dynamic_link
754 #define MY_finish_dynamic_link 0
757 static const struct aout_backend_data sunos4_aout_backend
=
759 0, /* Zmagic files are not contiguous. */
760 1, /* Text includes header. */
761 MY_entry_is_text_address
,
763 0, /* Default text vma. */
765 0, /* Header is counted in zmagic text. */
766 MY_add_dynamic_symbols
,
768 MY_link_dynamic_object
,
769 MY_write_dynamic_symbol
,
770 MY_check_dynamic_reloc
,
771 MY_finish_dynamic_link
774 #define MY_core_file_failing_command sunos4_core_file_failing_command
775 #define MY_core_file_failing_signal sunos4_core_file_failing_signal
776 #define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p
778 #define MY_bfd_debug_info_start bfd_void
779 #define MY_bfd_debug_info_end bfd_void
780 #define MY_bfd_debug_info_accumulate (void (*) (bfd *, struct bfd_section *)) bfd_void
781 #define MY_core_file_p sunos4_core_file_p
782 #define MY_write_object_contents NAME(aout, sunos4_write_object_contents)
783 #define MY_backend_data & sunos4_aout_backend
785 #ifndef TARGET_IS_LITTLE_ENDIAN_P
786 #define TARGET_IS_BIG_ENDIAN_P
789 #include "aout-target.h"