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