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, 2006, 2007
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 3 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,
22 MA 02110-1301, USA. */
28 #include "aout/sun4.h"
29 #include "libaout.h" /* BFD a.out internal data structures. */
31 #include "aout/aout64.h"
32 #include "aout/stab_gnu.h"
35 /* This is needed to reject a NewsOS file, e.g. in
36 gdb/testsuite/gdb.t10/crossload.exp. <kingdon@cygnus.com>
37 I needed to add M_UNKNOWN to recognize a 68000 object, so this will
38 probably no longer reject a NewsOS object. <ian@cygnus.com>. */
40 #define MACHTYPE_OK(mtype) \
41 (((mtype) == M_SPARC && bfd_lookup_arch (bfd_arch_sparc, 0) != NULL) \
42 || (((mtype) == M_UNKNOWN || (mtype) == M_68010 || (mtype) == M_68020) \
43 && bfd_lookup_arch (bfd_arch_m68k, 0) != NULL))
46 /* The file @code{aoutf1.h} contains the code for BFD's
47 a.out back end. Control over the generated back end is given by these
48 two preprocessor names:
51 This value should be either 32 or 64, depending upon the size of an
52 int in the target format. It changes the sizes of the structs which
53 perform the memory/disk mapping of structures.
55 The 64 bit backend may only be used if the host compiler supports 64
56 ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}.
57 With this name defined, @emph{all} bfd operations are performed with 64bit
58 arithmetic, not just those to a 64bit target.
61 The name put into the target vector.
66 #define sunos_set_arch_mach sunos_64_set_arch_mach
67 #define sunos_write_object_contents aout_64_sunos4_write_object_contents
69 #define sunos_set_arch_mach sunos_32_set_arch_mach
70 #define sunos_write_object_contents aout_32_sunos4_write_object_contents
73 /* Merge backend data into the output file.
74 This is necessary on sparclet-aout where we want the resultant machine
75 number to be M_SPARCLET if any input file is M_SPARCLET. */
77 #define MY_bfd_merge_private_bfd_data sunos_merge_private_bfd_data
80 sunos_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
82 if (bfd_get_flavour (ibfd) != bfd_target_aout_flavour
83 || bfd_get_flavour (obfd) != bfd_target_aout_flavour)
86 if (bfd_get_arch (obfd) == bfd_arch_sparc)
88 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
89 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
95 /* This is either sunos_32_set_arch_mach or sunos_64_set_arch_mach,
96 depending upon ARCH_SIZE. */
99 sunos_set_arch_mach (bfd *abfd, enum machine_type machtype)
101 /* Determine the architecture and machine type of the object file. */
102 enum bfd_architecture arch;
103 unsigned long machine;
108 /* Some Sun3s make magic numbers without cpu types in them, so
109 we'll default to the 68000. */
110 arch = bfd_arch_m68k;
111 machine = bfd_mach_m68000;
116 arch = bfd_arch_m68k;
117 machine = bfd_mach_m68010;
122 arch = bfd_arch_m68k;
123 machine = bfd_mach_m68020;
127 arch = bfd_arch_sparc;
132 arch = bfd_arch_sparc;
133 machine = bfd_mach_sparc_sparclet;
137 arch = bfd_arch_sparc;
138 machine = bfd_mach_sparc_sparclite_le;
143 arch = bfd_arch_i386;
148 arch = bfd_arch_m68k;
153 arch = bfd_arch_obscure;
157 bfd_set_arch_mach (abfd, arch, machine);
160 #define SET_ARCH_MACH(ABFD, EXEC) \
161 NAME(sunos,set_arch_mach) (ABFD, N_MACHTYPE (EXEC)); \
162 choose_reloc_size(ABFD);
164 /* Determine the size of a relocation entry, based on the architecture. */
167 choose_reloc_size (bfd *abfd)
169 switch (bfd_get_arch (abfd))
172 obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
175 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
180 /* Write an object file in SunOS format. Section contents have
181 already been written. We write the file header, symbols, and
182 relocation. The real name of this function is either
183 aout_64_sunos4_write_object_contents or
184 aout_32_sunos4_write_object_contents, depending upon ARCH_SIZE. */
187 sunos_write_object_contents (bfd *abfd)
189 struct external_exec exec_bytes;
190 struct internal_exec *execp = exec_hdr (abfd);
192 /* Magic number, maestro, please! */
193 switch (bfd_get_arch (abfd))
196 switch (bfd_get_mach (abfd))
198 case bfd_mach_m68000:
199 N_SET_MACHTYPE (*execp, M_UNKNOWN);
201 case bfd_mach_m68010:
202 N_SET_MACHTYPE (*execp, M_68010);
205 case bfd_mach_m68020:
206 N_SET_MACHTYPE (*execp, M_68020);
211 switch (bfd_get_mach (abfd))
213 case bfd_mach_sparc_sparclet:
214 N_SET_MACHTYPE (*execp, M_SPARCLET);
216 case bfd_mach_sparc_sparclite_le:
217 N_SET_MACHTYPE (*execp, M_SPARCLITE_LE);
220 N_SET_MACHTYPE (*execp, M_SPARC);
225 N_SET_MACHTYPE (*execp, M_386);
228 N_SET_MACHTYPE (*execp, M_UNKNOWN);
231 choose_reloc_size (abfd);
233 N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
235 N_SET_DYNAMIC (*execp, (long)(bfd_get_file_flags (abfd) & DYNAMIC));
237 WRITE_HEADERS (abfd, execp);
244 #define CORE_MAGIC 0x080456
245 #define CORE_NAMELEN 16
247 /* The core structure is taken from the Sun documentation.
248 Unfortunately, they don't document the FPA structure, or at least I
249 can't find it easily. Fortunately the core header contains its own
250 length. So this shouldn't cause problems, except for c_ucode, which
251 so far we don't use but is easy to find with a little arithmetic. */
253 /* But the reg structure can be gotten from the SPARC processor handbook.
254 This really should be in a GNU include file though so that gdb can use
279 /* Taken from Sun documentation: */
281 /* FIXME: It's worse than we expect. This struct contains TWO substructs
282 neither of whose size we know, WITH STUFF IN BETWEEN THEM! We can't
283 even portably access the stuff in between! */
285 struct external_sparc_core
287 int c_magic; /* Corefile magic number. */
288 int c_len; /* Sizeof (struct core). */
289 #define SPARC_CORE_LEN 432
290 struct regs c_regs; /* General purpose registers -- MACHDEP SIZE. */
291 struct external_exec c_aouthdr; /* A.out header. */
292 int c_signo; /* Killing signal, if any. */
293 int c_tsize; /* Text size (bytes). */
294 int c_dsize; /* Data size (bytes). */
295 int c_ssize; /* Stack size (bytes). */
296 char c_cmdname[CORE_NAMELEN + 1]; /* Command name. */
297 double fp_stuff[1]; /* External FPU state (size unknown by us). */
298 /* The type "double" is critical here, for alignment.
299 SunOS declares a struct here, but the struct's
300 alignment is double since it contains doubles. */
301 int c_ucode; /* Exception no. from u_code. */
302 /* This member is not accessible by name since
303 we don't portably know the size of fp_stuff. */
306 /* Core files generated by the BCP (the part of Solaris which allows
307 it to run SunOS4 a.out files). */
308 struct external_solaris_bcp_core
310 int c_magic; /* Corefile magic number. */
311 int c_len; /* Sizeof (struct core). */
312 #define SOLARIS_BCP_CORE_LEN 456
313 struct regs c_regs; /* General purpose registers -- MACHDEP SIZE. */
314 int c_exdata_vp; /* Exdata structure. */
319 int c_exdata_nshlibs;
322 int c_exdata_toffset;
323 int c_exdata_doffset;
324 int c_exdata_loffset;
328 int c_signo; /* Killing signal, if any. */
329 int c_tsize; /* Text size (bytes). */
330 int c_dsize; /* Data size (bytes). */
331 int c_ssize; /* Stack size (bytes). */
332 char c_cmdname[CORE_NAMELEN + 1]; /* Command name. */
333 double fp_stuff[1]; /* External FPU state (size unknown by us). */
334 /* The type "double" is critical here, for alignment.
335 SunOS declares a struct here, but the struct's
336 alignment is double since it contains doubles. */
337 int c_ucode; /* Exception no. from u_code. */
338 /* This member is not accessible by name since
339 we don't portably know the size of fp_stuff. */
342 struct external_sun3_core
344 int c_magic; /* Corefile magic number. */
345 int c_len; /* Sizeof (struct core). */
346 #define SUN3_CORE_LEN 826 /* As of SunOS 4.1.1. */
347 int c_regs[18]; /* General purpose registers -- MACHDEP SIZE. */
348 struct external_exec c_aouthdr; /* A.out header. */
349 int c_signo; /* Killing signal, if any. */
350 int c_tsize; /* Text size (bytes). */
351 int c_dsize; /* Data size (bytes). */
352 int c_ssize; /* Stack size (bytes). */
353 char c_cmdname[CORE_NAMELEN + 1]; /* Command name. */
354 double fp_stuff[1]; /* External FPU state (size unknown by us). */
355 /* The type "double" is critical here, for alignment.
356 SunOS declares a struct here, but the struct's
357 alignment is double since it contains doubles. */
358 int c_ucode; /* Exception no. from u_code. */
359 /* This member is not accessible by name since
360 we don't portably know the size of fp_stuff. */
363 struct internal_sunos_core
365 int c_magic; /* Corefile magic number. */
366 int c_len; /* Sizeof (struct core). */
367 long c_regs_pos; /* File offset of General purpose registers. */
368 int c_regs_size; /* Size of General purpose registers. */
369 struct internal_exec c_aouthdr; /* A.out header. */
370 int c_signo; /* Killing signal, if any. */
371 int c_tsize; /* Text size (bytes). */
372 int c_dsize; /* Data size (bytes). */
373 bfd_vma c_data_addr; /* Data start (address). */
374 int c_ssize; /* Stack size (bytes). */
375 bfd_vma c_stacktop; /* Stack top (address). */
376 char c_cmdname[CORE_NAMELEN + 1]; /* Command name. */
377 long fp_stuff_pos; /* File offset of external FPU state (regs). */
378 int fp_stuff_size; /* Size of it. */
379 int c_ucode; /* Exception no. from u_code. */
382 /* Byte-swap in the Sun-3 core structure. */
385 swapcore_sun3 (bfd *abfd, char *ext, struct internal_sunos_core *intcore)
387 struct external_sun3_core *extcore = (struct external_sun3_core *) ext;
389 intcore->c_magic = H_GET_32 (abfd, &extcore->c_magic);
390 intcore->c_len = H_GET_32 (abfd, &extcore->c_len);
391 intcore->c_regs_pos = offsetof (struct external_sun3_core, c_regs);
392 intcore->c_regs_size = sizeof (extcore->c_regs);
394 aout_64_swap_exec_header_in
396 aout_32_swap_exec_header_in
398 (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
399 intcore->c_signo = H_GET_32 (abfd, &extcore->c_signo);
400 intcore->c_tsize = H_GET_32 (abfd, &extcore->c_tsize);
401 intcore->c_dsize = H_GET_32 (abfd, &extcore->c_dsize);
402 intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr);
403 intcore->c_ssize = H_GET_32 (abfd, &extcore->c_ssize);
404 memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
405 intcore->fp_stuff_pos = offsetof (struct external_sun3_core, fp_stuff);
406 /* FP stuff takes up whole rest of struct, except c_ucode. */
407 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
408 offsetof (struct external_sun3_core, fp_stuff);
409 /* Ucode is the last thing in the struct -- just before the end. */
410 intcore->c_ucode = H_GET_32 (abfd,
412 - sizeof (extcore->c_ucode)
413 + (unsigned char *) extcore));
414 intcore->c_stacktop = 0x0E000000; /* By experimentation. */
417 /* Byte-swap in the Sparc core structure. */
420 swapcore_sparc (bfd *abfd, char *ext, struct internal_sunos_core *intcore)
422 struct external_sparc_core *extcore = (struct external_sparc_core *) ext;
424 intcore->c_magic = H_GET_32 (abfd, &extcore->c_magic);
425 intcore->c_len = H_GET_32 (abfd, &extcore->c_len);
426 intcore->c_regs_pos = offsetof (struct external_sparc_core, c_regs);
427 intcore->c_regs_size = sizeof (extcore->c_regs);
429 aout_64_swap_exec_header_in
431 aout_32_swap_exec_header_in
433 (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
434 intcore->c_signo = H_GET_32 (abfd, &extcore->c_signo);
435 intcore->c_tsize = H_GET_32 (abfd, &extcore->c_tsize);
436 intcore->c_dsize = H_GET_32 (abfd, &extcore->c_dsize);
437 intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr);
438 intcore->c_ssize = H_GET_32 (abfd, &extcore->c_ssize);
439 memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
440 intcore->fp_stuff_pos = offsetof (struct external_sparc_core, fp_stuff);
441 /* FP stuff takes up whole rest of struct, except c_ucode. */
442 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
443 offsetof (struct external_sparc_core, fp_stuff);
444 /* Ucode is the last thing in the struct -- just before the end. */
445 intcore->c_ucode = H_GET_32 (abfd,
447 - sizeof (extcore->c_ucode)
448 + (unsigned char *) extcore));
450 /* Supposedly the user stack grows downward from the bottom of kernel memory.
451 Presuming that this remains true, this definition will work. */
452 /* Now sun has provided us with another challenge. The value is different
453 for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or
454 the other based on the current value of the stack pointer. This
455 loses (a) if the stack pointer has been clobbered, or (b) if the stack
456 is larger than 128 megabytes.
458 It's times like these you're glad they're switching to ELF.
460 Note that using include files or nlist on /vmunix would be wrong,
461 because we want the value for this core file, no matter what kind of
462 machine we were compiled on or are running on. */
463 #define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
464 #define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
466 bfd_vma sp = H_GET_32 (abfd, &extcore->c_regs.r_o6);
467 if (sp < SPARC_USRSTACK_SPARC10)
468 intcore->c_stacktop = SPARC_USRSTACK_SPARC10;
470 intcore->c_stacktop = SPARC_USRSTACK_SPARC2;
474 /* Byte-swap in the Solaris BCP core structure. */
477 swapcore_solaris_bcp (bfd *abfd, char *ext, struct internal_sunos_core *intcore)
479 struct external_solaris_bcp_core *extcore =
480 (struct external_solaris_bcp_core *) ext;
482 intcore->c_magic = H_GET_32 (abfd, &extcore->c_magic);
483 intcore->c_len = H_GET_32 (abfd, &extcore->c_len);
484 intcore->c_regs_pos = offsetof (struct external_solaris_bcp_core, c_regs);
485 intcore->c_regs_size = sizeof (extcore->c_regs);
487 /* The Solaris BCP exdata structure does not contain an a_syms field,
488 so we are unable to synthesize an internal exec header.
489 Luckily we are able to figure out the start address of the data section,
490 which is the only thing needed from the internal exec header,
491 from the exdata structure.
493 As of Solaris 2.3, BCP core files for statically linked executables
494 are buggy. The exdata structure is not properly filled in, and
495 the data section is written from address zero instead of the data
497 memset ((void *) &intcore->c_aouthdr, 0, sizeof (struct internal_exec));
498 intcore->c_data_addr = H_GET_32 (abfd, &extcore->c_exdata_datorg);
499 intcore->c_signo = H_GET_32 (abfd, &extcore->c_signo);
500 intcore->c_tsize = H_GET_32 (abfd, &extcore->c_tsize);
501 intcore->c_dsize = H_GET_32 (abfd, &extcore->c_dsize);
502 intcore->c_ssize = H_GET_32 (abfd, &extcore->c_ssize);
503 memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
504 intcore->fp_stuff_pos =
505 offsetof (struct external_solaris_bcp_core, fp_stuff);
506 /* FP stuff takes up whole rest of struct, except c_ucode. */
507 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
508 offsetof (struct external_solaris_bcp_core, fp_stuff);
509 /* Ucode is the last thing in the struct -- just before the end */
510 intcore->c_ucode = H_GET_32 (abfd,
512 - sizeof (extcore->c_ucode)
513 + (unsigned char *) extcore));
515 /* Supposedly the user stack grows downward from the bottom of kernel memory.
516 Presuming that this remains true, this definition will work. */
517 /* Now sun has provided us with another challenge. The value is different
518 for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or
519 the other based on the current value of the stack pointer. This
520 loses (a) if the stack pointer has been clobbered, or (b) if the stack
521 is larger than 128 megabytes.
523 It's times like these you're glad they're switching to ELF.
525 Note that using include files or nlist on /vmunix would be wrong,
526 because we want the value for this core file, no matter what kind of
527 machine we were compiled on or are running on. */
528 #define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
529 #define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
531 bfd_vma sp = H_GET_32 (abfd, &extcore->c_regs.r_o6);
532 if (sp < SPARC_USRSTACK_SPARC10)
533 intcore->c_stacktop = SPARC_USRSTACK_SPARC10;
535 intcore->c_stacktop = SPARC_USRSTACK_SPARC2;
539 /* Need this cast because ptr is really void *. */
540 #define core_hdr(bfd) ((bfd)->tdata.sun_core_data)
541 #define core_datasec(bfd) (core_hdr (bfd)->data_section)
542 #define core_stacksec(bfd) (core_hdr (bfd)->stack_section)
543 #define core_regsec(bfd) (core_hdr (bfd)->reg_section)
544 #define core_reg2sec(bfd) (core_hdr (bfd)->reg2_section)
546 /* These are stored in the bfd's tdata. */
547 struct sun_core_struct
549 struct internal_sunos_core *hdr; /* Core file header. */
550 asection *data_section;
551 asection *stack_section;
552 asection *reg_section;
553 asection *reg2_section;
556 static const bfd_target *
557 sunos4_core_file_p (bfd *abfd)
559 unsigned char longbuf[4]; /* Raw bytes of various header fields. */
560 bfd_size_type core_size, amt;
561 unsigned long core_mag;
562 struct internal_sunos_core *core;
566 struct sun_core_struct suncoredata;
567 struct internal_sunos_core internal_sunos_core;
568 char external_core[1];
572 if (bfd_bread ((void *) longbuf, (bfd_size_type) sizeof (longbuf), abfd)
575 core_mag = H_GET_32 (abfd, longbuf);
577 if (core_mag != CORE_MAGIC)
580 /* SunOS core headers can vary in length; second word is size; */
581 if (bfd_bread ((void *) longbuf, (bfd_size_type) sizeof (longbuf), abfd)
584 core_size = H_GET_32 (abfd, longbuf);
586 if (core_size > 20000)
589 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
592 amt = core_size + sizeof (struct mergem);
593 mergem = bfd_zalloc (abfd, amt);
597 extcore = mergem->external_core;
599 if ((bfd_bread ((void *) extcore, core_size, abfd)) != core_size)
602 bfd_release (abfd, (char *) mergem);
603 abfd->tdata.any = NULL;
604 bfd_section_list_clear (abfd);
608 /* Validate that it's a core file we know how to handle, due to sun
609 botching the positioning of registers and other fields in a machine
611 core = &mergem->internal_sunos_core;
615 swapcore_sparc (abfd, extcore, core);
618 swapcore_sun3 (abfd, extcore, core);
620 case SOLARIS_BCP_CORE_LEN:
621 swapcore_solaris_bcp (abfd, extcore, core);
624 bfd_set_error (bfd_error_system_call); /* FIXME. */
628 abfd->tdata.sun_core_data = &mergem->suncoredata;
629 abfd->tdata.sun_core_data->hdr = core;
631 /* Create the sections. */
632 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
633 core_stacksec (abfd) = bfd_make_section_anyway_with_flags (abfd, ".stack",
635 if (core_stacksec (abfd) == NULL)
636 /* bfd_release frees everything allocated after it's arg. */
639 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
640 core_datasec (abfd) = bfd_make_section_anyway_with_flags (abfd, ".data",
642 if (core_datasec (abfd) == NULL)
645 flags = SEC_HAS_CONTENTS;
646 core_regsec (abfd) = bfd_make_section_anyway_with_flags (abfd, ".reg",
648 if (core_regsec (abfd) == NULL)
651 flags = SEC_HAS_CONTENTS;
652 core_reg2sec (abfd) = bfd_make_section_anyway_with_flags (abfd, ".reg2",
654 if (core_reg2sec (abfd) == NULL)
657 core_stacksec (abfd)->size = core->c_ssize;
658 core_datasec (abfd)->size = core->c_dsize;
659 core_regsec (abfd)->size = core->c_regs_size;
660 core_reg2sec (abfd)->size = core->fp_stuff_size;
662 core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize);
663 core_datasec (abfd)->vma = core->c_data_addr;
664 core_regsec (abfd)->vma = 0;
665 core_reg2sec (abfd)->vma = 0;
667 core_stacksec (abfd)->filepos = core->c_len + core->c_dsize;
668 core_datasec (abfd)->filepos = core->c_len;
669 /* We'll access the regs afresh in the core file, like any section: */
670 core_regsec (abfd)->filepos = (file_ptr) core->c_regs_pos;
671 core_reg2sec (abfd)->filepos = (file_ptr) core->fp_stuff_pos;
673 /* Align to word at least. */
674 core_stacksec (abfd)->alignment_power = 2;
675 core_datasec (abfd)->alignment_power = 2;
676 core_regsec (abfd)->alignment_power = 2;
677 core_reg2sec (abfd)->alignment_power = 2;
683 sunos4_core_file_failing_command (bfd *abfd)
685 return core_hdr (abfd)->hdr->c_cmdname;
689 sunos4_core_file_failing_signal (bfd *abfd)
691 return core_hdr (abfd)->hdr->c_signo;
695 sunos4_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
697 if (core_bfd->xvec != exec_bfd->xvec)
699 bfd_set_error (bfd_error_system_call);
703 /* Solaris core files do not include an aouthdr. */
704 if ((core_hdr (core_bfd)->hdr)->c_len == SOLARIS_BCP_CORE_LEN)
707 return memcmp ((char *) &((core_hdr (core_bfd)->hdr)->c_aouthdr),
708 (char *) exec_hdr (exec_bfd),
709 sizeof (struct internal_exec)) == 0;
712 #define MY_set_sizes sunos4_set_sizes
715 sunos4_set_sizes (bfd *abfd)
717 switch (bfd_get_arch (abfd))
722 adata (abfd).page_size = 0x2000;
723 adata (abfd).segment_size = 0x2000;
724 adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
727 adata (abfd).page_size = 0x2000;
728 adata (abfd).segment_size = 0x20000;
729 adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
734 /* We default to setting the toolversion field to 1, as is required by
736 #ifndef MY_exec_hdr_flags
737 #define MY_exec_hdr_flags 1
740 #ifndef MY_entry_is_text_address
741 #define MY_entry_is_text_address 0
743 #ifndef MY_add_dynamic_symbols
744 #define MY_add_dynamic_symbols 0
746 #ifndef MY_add_one_symbol
747 #define MY_add_one_symbol 0
749 #ifndef MY_link_dynamic_object
750 #define MY_link_dynamic_object 0
752 #ifndef MY_write_dynamic_symbol
753 #define MY_write_dynamic_symbol 0
755 #ifndef MY_check_dynamic_reloc
756 #define MY_check_dynamic_reloc 0
758 #ifndef MY_finish_dynamic_link
759 #define MY_finish_dynamic_link 0
762 static const struct aout_backend_data sunos4_aout_backend =
764 0, /* Zmagic files are not contiguous. */
765 1, /* Text includes header. */
766 MY_entry_is_text_address,
768 0, /* Default text vma. */
770 0, /* Header is counted in zmagic text. */
771 MY_add_dynamic_symbols,
773 MY_link_dynamic_object,
774 MY_write_dynamic_symbol,
775 MY_check_dynamic_reloc,
776 MY_finish_dynamic_link
779 #define MY_core_file_failing_command sunos4_core_file_failing_command
780 #define MY_core_file_failing_signal sunos4_core_file_failing_signal
781 #define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p
783 #define MY_bfd_debug_info_start bfd_void
784 #define MY_bfd_debug_info_end bfd_void
785 #define MY_bfd_debug_info_accumulate (void (*) (bfd *, struct bfd_section *)) bfd_void
786 #define MY_core_file_p sunos4_core_file_p
787 #define MY_write_object_contents NAME(aout, sunos4_write_object_contents)
788 #define MY_backend_data & sunos4_aout_backend
790 #ifndef TARGET_IS_LITTLE_ENDIAN_P
791 #define TARGET_IS_BIG_ENDIAN_P
794 #include "aout-target.h"