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