1 /* A.out "format 1" file handling code for BFD.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25 #include "aout/sun4.h"
26 #include "libaout.h" /* BFD a.out internal data structures */
28 #include "aout/aout64.h"
29 #include "aout/stab_gnu.h"
32 /* This is needed to reject a NewsOS file, e.g. in
34 I needed to add M_UNKNOWN to recognize a 68000 object, so this will
36 #define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \
37 || (mtype) == M_68010 \
38 || (mtype) == M_68020 \
39 || (mtype) == M_SPARC)
42 The file @code{aoutf1.h} contains the code for BFD's
43 a.out back end. Control over the generated back end is given by these
44 two preprocessor names:
47 This value should be either 32 or 64, depending upon the size of an
48 int in the target format. It changes the sizes of the structs which
49 perform the memory/disk mapping of structures.
51 The 64 bit backend may only be used if the host compiler supports 64
52 ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}.
53 With this name defined, @emph{all} bfd operations are performed with 64bit
54 arithmetic, not just those to a 64bit target.
57 The name put into the target vector.
68 sunos_64_set_arch_mach
70 sunos_32_set_arch_mach
76 /* Determine the architecture and machine type of the object file. */
77 enum bfd_architecture arch;
83 /* Some Sun3s make magic numbers without cpu types in them, so
84 we'll default to the 68000. */
102 arch = bfd_arch_sparc;
108 arch = bfd_arch_i386;
113 arch = bfd_arch_a29k;
118 arch = bfd_arch_m68k;
123 arch = bfd_arch_obscure;
127 bfd_set_arch_mach (abfd, arch, machine);
130 #define SET_ARCH_MACH(ABFD, EXEC) \
131 NAME(sunos,set_arch_mach)(ABFD, N_MACHTYPE (EXEC)); \
132 choose_reloc_size(ABFD);
134 /* Determine the size of a relocation entry, based on the architecture */
136 choose_reloc_size (abfd)
139 switch (bfd_get_arch (abfd))
143 obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
146 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
151 /* Write an object file in SunOS format.
152 Section contents have already been written. We write the
153 file header, symbols, and relocation. */
157 aout_64_sunos4_write_object_contents
159 aout_32_sunos4_write_object_contents
164 struct external_exec exec_bytes;
165 struct internal_exec *execp = exec_hdr (abfd);
167 /* Magic number, maestro, please! */
168 switch (bfd_get_arch (abfd))
171 switch (bfd_get_mach (abfd))
174 N_SET_MACHTYPE (*execp, M_68010);
178 N_SET_MACHTYPE (*execp, M_68020);
183 N_SET_MACHTYPE (*execp, M_SPARC);
186 N_SET_MACHTYPE (*execp, M_386);
189 N_SET_MACHTYPE (*execp, M_29K);
192 N_SET_MACHTYPE (*execp, M_UNKNOWN);
195 choose_reloc_size (abfd);
198 /* Some tools want this to be 0, some tools want this to be one.
199 Today, it seems that 0 is the most important setting (PR1927) */
200 N_SET_FLAGS (*execp, 0x0);
203 /* Fri Jun 11 14:23:31 PDT 1993
205 Today's optimal setting is 1. This is a pain, since it
206 reopens 1927. This should be readdressed by creating a new
207 target for each each supported, giving perhaps sun3/m68k
208 and sun4/sparc a.out formats.
210 N_SET_FLAGS (*execp, 1);
213 N_SET_DYNAMIC (*execp, bfd_get_file_flags (abfd) & DYNAMIC);
215 /* At least for SunOS, the dynamic symbols and relocs are embedded
216 in the .text section, and we do not want to write them out with
217 the symbol table. FIXME: This may be right if there is any other
218 form of a.out shared libraries. */
219 if ((bfd_get_file_flags (abfd) & DYNAMIC) != 0
220 && bfd_get_outsymbols (abfd) != (asymbol **) NULL)
223 asymbol **sym_ptr_ptr;
225 arelent **rel_ptr_ptr;
227 sym_ptr_ptr = bfd_get_outsymbols (abfd);
228 count = bfd_get_symcount (abfd);
229 for (i = 0; i < count; i++, sym_ptr_ptr++)
231 if (((*sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
233 /* This assumes that all dynamic symbols follow all
234 non-dynamic symbols, which is what slurp_symbol_table
237 bfd_get_symcount (abfd) = i;
242 if (obj_textsec (abfd)->reloc_count > 0)
244 rel_ptr_ptr = obj_textsec (abfd)->orelocation;
245 count = obj_textsec (abfd)->reloc_count;
246 for (i = 0; i < count; i++, rel_ptr_ptr++)
248 if (((*(*rel_ptr_ptr)->sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
250 /* This assumes that all relocs against dynamic
251 symbols follow all relocs against other symbols,
252 which is what slurp_reloc_table does. */
254 obj_textsec (abfd)->reloc_count = i;
260 if (obj_datasec (abfd)->reloc_count > 0)
262 rel_ptr_ptr = obj_datasec (abfd)->orelocation;
263 count = obj_datasec (abfd)->reloc_count;
264 for (i = 0; i < count; i++, rel_ptr_ptr++)
266 if (((*(*rel_ptr_ptr)->sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
269 obj_datasec (abfd)->reloc_count = i;
276 WRITE_HEADERS (abfd, execp);
283 #define CORE_MAGIC 0x080456
284 #define CORE_NAMELEN 16
286 /* The core structure is taken from the Sun documentation.
287 Unfortunately, they don't document the FPA structure, or at least I
288 can't find it easily. Fortunately the core header contains its own
289 length. So this shouldn't cause problems, except for c_ucode, which
290 so far we don't use but is easy to find with a little arithmetic. */
292 /* But the reg structure can be gotten from the SPARC processor handbook.
293 This really should be in a GNU include file though so that gdb can use
318 /* Taken from Sun documentation: */
320 /* FIXME: It's worse than we expect. This struct contains TWO substructs
321 neither of whose size we know, WITH STUFF IN BETWEEN THEM! We can't
322 even portably access the stuff in between! */
324 struct external_sparc_core
326 int c_magic; /* Corefile magic number */
327 int c_len; /* Sizeof (struct core) */
328 #define SPARC_CORE_LEN 432
329 int c_regs[19]; /* General purpose registers -- MACHDEP SIZE */
330 struct external_exec c_aouthdr; /* A.out header */
331 int c_signo; /* Killing signal, if any */
332 int c_tsize; /* Text size (bytes) */
333 int c_dsize; /* Data size (bytes) */
334 int c_ssize; /* Stack size (bytes) */
335 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
336 double fp_stuff[1]; /* external FPU state (size unknown by us) */
337 /* The type "double" is critical here, for alignment.
338 SunOS declares a struct here, but the struct's alignment
339 is double since it contains doubles. */
340 int c_ucode; /* Exception no. from u_code */
341 /* (this member is not accessible by name since we don't
342 portably know the size of fp_stuff.) */
345 struct external_sun3_core
347 int c_magic; /* Corefile magic number */
348 int c_len; /* Sizeof (struct core) */
349 #define SUN3_CORE_LEN 826 /* As of SunOS 4.1.1 */
350 int c_regs[18]; /* General purpose registers -- MACHDEP SIZE */
351 struct external_exec c_aouthdr; /* A.out header */
352 int c_signo; /* Killing signal, if any */
353 int c_tsize; /* Text size (bytes) */
354 int c_dsize; /* Data size (bytes) */
355 int c_ssize; /* Stack size (bytes) */
356 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
357 double fp_stuff[1]; /* external FPU state (size unknown by us) */
358 /* The type "double" is critical here, for alignment.
359 SunOS declares a struct here, but the struct's alignment
360 is double since it contains doubles. */
361 int c_ucode; /* Exception no. from u_code */
362 /* (this member is not accessible by name since we don't
363 portably know the size of fp_stuff.) */
366 struct internal_sunos_core
368 int c_magic; /* Corefile magic number */
369 int c_len; /* Sizeof (struct core) */
370 long c_regs_pos; /* file offset of General purpose registers */
371 int c_regs_size; /* size of General purpose registers */
372 struct internal_exec c_aouthdr; /* A.out header */
373 int c_signo; /* Killing signal, if any */
374 int c_tsize; /* Text size (bytes) */
375 int c_dsize; /* Data size (bytes) */
376 int c_ssize; /* Stack size (bytes) */
377 bfd_vma c_stacktop; /* Stack top (address) */
378 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
379 long fp_stuff_pos; /* file offset of external FPU state (regs) */
380 int fp_stuff_size; /* Size of it */
381 int c_ucode; /* Exception no. from u_code */
384 /* byte-swap in the Sun-3 core structure */
386 swapcore_sun3 (abfd, ext, intcore)
389 struct internal_sunos_core *intcore;
391 struct external_sun3_core *extcore = (struct external_sun3_core *) ext;
393 intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic);
394 intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len);
395 intcore->c_regs_pos = (long) (((struct external_sun3_core *) 0)->c_regs);
396 intcore->c_regs_size = sizeof (extcore->c_regs);
398 aout_64_swap_exec_header_in
400 aout_32_swap_exec_header_in
402 (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
403 intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo);
404 intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize);
405 intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize);
406 intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize);
407 memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
408 intcore->fp_stuff_pos = (long) (((struct external_sun3_core *) 0)->fp_stuff);
409 /* FP stuff takes up whole rest of struct, except c_ucode. */
410 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
411 (file_ptr) (((struct external_sun3_core *) 0)->fp_stuff);
412 /* Ucode is the last thing in the struct -- just before the end */
415 intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore);
416 intcore->c_stacktop = 0x0E000000; /* By experimentation */
420 /* byte-swap in the Sparc core structure */
422 swapcore_sparc (abfd, ext, intcore)
425 struct internal_sunos_core *intcore;
427 struct external_sparc_core *extcore = (struct external_sparc_core *) ext;
429 intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic);
430 intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len);
431 intcore->c_regs_pos = (long) (((struct external_sparc_core *) 0)->c_regs);
432 intcore->c_regs_size = sizeof (extcore->c_regs);
434 aout_64_swap_exec_header_in
436 aout_32_swap_exec_header_in
438 (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr);
439 intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo);
440 intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize);
441 intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize);
442 intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize);
443 memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname));
444 intcore->fp_stuff_pos = (long) (((struct external_sparc_core *) 0)->fp_stuff);
445 /* FP stuff takes up whole rest of struct, except c_ucode. */
446 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
447 (file_ptr) (((struct external_sparc_core *) 0)->fp_stuff);
448 /* Ucode is the last thing in the struct -- just before the end */
451 intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore);
453 /* Supposedly the user stack grows downward from the bottom of kernel memory.
454 Presuming that this remains true, this definition will work. */
455 /* Now sun has provided us with another challenge. The value is different
456 for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or
457 the other based on the current value of the stack pointer. This
458 loses (a) if the stack pointer has been clobbered, or (b) if the stack
459 is larger than 128 megabytes.
461 It's times like these you're glad they're switching to ELF.
463 Note that using include files or nlist on /vmunix would be wrong,
464 because we want the value for this core file, no matter what kind of
465 machine we were compiled on or are running on. */
466 #define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000)
467 #define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000)
469 bfd_vma sp = bfd_h_get_32
470 (abfd, (unsigned char *) &((struct regs *) &extcore->c_regs[0])->r_o6);
471 if (sp < SPARC_USRSTACK_SPARC10)
472 intcore->c_stacktop = SPARC_USRSTACK_SPARC10;
474 intcore->c_stacktop = SPARC_USRSTACK_SPARC2;
478 /* need this cast because ptr is really void * */
479 #define core_hdr(bfd) ((bfd)->tdata.sun_core_data)
480 #define core_datasec(bfd) (core_hdr(bfd)->data_section)
481 #define core_stacksec(bfd) (core_hdr(bfd)->stack_section)
482 #define core_regsec(bfd) (core_hdr(bfd)->reg_section)
483 #define core_reg2sec(bfd) (core_hdr(bfd)->reg2_section)
485 /* These are stored in the bfd's tdata */
486 struct sun_core_struct
488 struct internal_sunos_core *hdr; /* core file header */
489 asection *data_section;
490 asection *stack_section;
491 asection *reg_section;
492 asection *reg2_section;
496 sunos4_core_file_p (abfd)
499 unsigned char longbuf[4]; /* Raw bytes of various header fields */
502 struct internal_sunos_core *core;
506 struct sun_core_struct suncoredata;
507 struct internal_sunos_core internal_sunos_core;
508 char external_core[1];
512 if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) !=
515 core_mag = bfd_h_get_32 (abfd, longbuf);
517 if (core_mag != CORE_MAGIC)
520 /* SunOS core headers can vary in length; second word is size; */
521 if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) !=
524 core_size = bfd_h_get_32 (abfd, longbuf);
526 if (core_size > 20000)
529 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0)
532 mergem = (struct mergem *) bfd_zalloc (abfd, core_size + sizeof (struct mergem));
535 bfd_set_error (bfd_error_no_memory);
539 extcore = mergem->external_core;
541 if ((bfd_read ((PTR) extcore, 1, core_size, abfd)) != core_size)
543 bfd_release (abfd, (char *) mergem);
547 /* Validate that it's a core file we know how to handle, due to sun
548 botching the positioning of registers and other fields in a machine
550 core = &mergem->internal_sunos_core;
554 swapcore_sparc (abfd, extcore, core);
557 swapcore_sun3 (abfd, extcore, core);
560 bfd_set_error (bfd_error_system_call); /* FIXME */
561 bfd_release (abfd, (char *) mergem);
565 abfd->tdata.sun_core_data = &mergem->suncoredata;
566 abfd->tdata.sun_core_data->hdr = core;
568 /* create the sections. This is raunchy, but bfd_close wants to reclaim
570 core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
571 if (core_stacksec (abfd) == NULL)
574 bfd_set_error (bfd_error_no_memory);
575 bfd_release (abfd, (char *) mergem);
578 core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
579 if (core_datasec (abfd) == NULL)
582 bfd_release (abfd, core_stacksec (abfd));
585 core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
586 if (core_regsec (abfd) == NULL)
589 bfd_release (abfd, core_datasec (abfd));
592 core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
593 if (core_reg2sec (abfd) == NULL)
595 bfd_release (abfd, core_regsec (abfd));
599 core_stacksec (abfd)->name = ".stack";
600 core_datasec (abfd)->name = ".data";
601 core_regsec (abfd)->name = ".reg";
602 core_reg2sec (abfd)->name = ".reg2";
604 core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
605 core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
606 core_regsec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
607 core_reg2sec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
609 core_stacksec (abfd)->_raw_size = core->c_ssize;
610 core_datasec (abfd)->_raw_size = core->c_dsize;
611 core_regsec (abfd)->_raw_size = core->c_regs_size;
612 core_reg2sec (abfd)->_raw_size = core->fp_stuff_size;
614 core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize);
615 core_datasec (abfd)->vma = N_DATADDR (core->c_aouthdr);
616 core_regsec (abfd)->vma = 0;
617 core_reg2sec (abfd)->vma = 0;
619 core_stacksec (abfd)->filepos = core->c_len + core->c_dsize;
620 core_datasec (abfd)->filepos = core->c_len;
621 /* We'll access the regs afresh in the core file, like any section: */
622 core_regsec (abfd)->filepos = (file_ptr) core->c_regs_pos;
623 core_reg2sec (abfd)->filepos = (file_ptr) core->fp_stuff_pos;
625 /* Align to word at least */
626 core_stacksec (abfd)->alignment_power = 2;
627 core_datasec (abfd)->alignment_power = 2;
628 core_regsec (abfd)->alignment_power = 2;
629 core_reg2sec (abfd)->alignment_power = 2;
631 abfd->sections = core_stacksec (abfd);
632 core_stacksec (abfd)->next = core_datasec (abfd);
633 core_datasec (abfd)->next = core_regsec (abfd);
634 core_regsec (abfd)->next = core_reg2sec (abfd);
636 abfd->section_count = 4;
642 sunos4_core_file_failing_command (abfd)
645 return core_hdr (abfd)->hdr->c_cmdname;
649 sunos4_core_file_failing_signal (abfd)
652 return core_hdr (abfd)->hdr->c_signo;
656 sunos4_core_file_matches_executable_p (core_bfd, exec_bfd)
660 if (core_bfd->xvec != exec_bfd->xvec)
662 bfd_set_error (bfd_error_system_call);
666 return (memcmp ((char *) &((core_hdr (core_bfd)->hdr)->c_aouthdr),
667 (char *) exec_hdr (exec_bfd),
668 sizeof (struct internal_exec)) == 0) ? true : false;
671 #define MY_set_sizes sunos4_set_sizes
673 sunos4_set_sizes (abfd)
676 switch (bfd_get_arch (abfd))
681 adata (abfd).page_size = 0x2000;
682 adata (abfd).segment_size = 0x2000;
683 adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
686 adata (abfd).page_size = 0x2000;
687 adata (abfd).segment_size = 0x20000;
688 adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
693 #ifndef MY_read_dynamic_symbols
694 #define MY_read_dynamic_symbols 0
696 #ifndef MY_read_dynamic_relocs
697 #define MY_read_dynamic_relocs 0
700 static CONST struct aout_backend_data sunos4_aout_backend =
702 0, /* zmagic files are not contiguous */
703 1, /* text includes header */
704 0, /* default text vma */
706 0, /* header is counted in zmagic text */
707 MY_read_dynamic_symbols,
708 MY_read_dynamic_relocs
711 #define MY_core_file_failing_command sunos4_core_file_failing_command
712 #define MY_core_file_failing_signal sunos4_core_file_failing_signal
713 #define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p
715 #define MY_bfd_debug_info_start bfd_void
716 #define MY_bfd_debug_info_end bfd_void
717 #define MY_bfd_debug_info_accumulate \
718 (void (*) PARAMS ((bfd *, struct sec *))) bfd_void
719 #define MY_core_file_p sunos4_core_file_p
720 #define MY_write_object_contents NAME(aout,sunos4_write_object_contents)
721 #define MY_backend_data &sunos4_aout_backend
723 #define TARGET_IS_BIG_ENDIAN_P
725 #include "aout-target.h"