]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/aoutf1.h
Sat Nov 2 14:26:03 1991 Steve Chamberlain (steve at cygnus.com)
[thirdparty/binutils-gdb.git] / bfd / aoutf1.h
1 /* A.out "format 1" file handling code
2 Copyright (C) 1990-1991 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24
25 #include <a.out.sun4.h>
26 #include "libaout.h"
27
28 #include "aout64.h"
29 #include "stab.gnu.h"
30 #include "ar.h"
31
32 /*
33 The file @code{aoutf1.h} contains the code for BFD's
34 a.out back end. Control over the generated back end is given by these
35 two preprocessor names:
36 @table @code
37 @item ARCH_SIZE
38 This value should be either 32 or 64, depending upon the size of an
39 int in the target format. It changes the sizes of the structs which
40 perform the memory/disk mapping of structures.
41
42 The 64 bit backend may only be used if the host compiler supports 64
43 ints (eg long long with gcc), by defining the name @code{HOST_64_BIT} in @code{bfd.h}.
44 With this name defined, @emph{all} bfd operations are performed with 64bit
45 arithmetic, not just those to a 64bit target.
46
47 @item TARGETNAME
48 The name put into the target vector.
49 @item
50 @end table
51
52 */
53
54 void (*bfd_error_trap)();
55
56 static bfd_target *sunos4_callback ();
57
58 /*SUPPRESS558*/
59 /*SUPPRESS529*/
60
61 bfd_target *
62 DEFUN(NAME(sunos,object_p), (abfd),
63 bfd *abfd)
64 {
65 struct external_exec exec_bytes; /* Raw exec header from file */
66 struct internal_exec exec; /* Cleaned-up exec header */
67
68 if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
69 != EXEC_BYTES_SIZE) {
70 bfd_error = wrong_format;
71 return 0;
72 }
73
74 exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
75
76 if (N_BADMAG (exec)) return 0;
77
78 NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec);
79
80 return NAME(aout,some_aout_object_p) (abfd, &exec, sunos4_callback);
81 }
82
83 /* Determine the size of a relocation entry, based on the architecture */
84 static void
85 DEFUN(choose_reloc_size,(abfd),
86 bfd *abfd)
87 {
88 switch (bfd_get_arch(abfd)) {
89 case bfd_arch_sparc:
90 case bfd_arch_a29k:
91 obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
92 break;
93 default:
94 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
95 break;
96 }
97 }
98
99 /* Set parameters about this a.out file that are machine-dependent.
100 This routine is called from some_aout_object_p just before it returns. */
101
102 static bfd_target *
103 sunos4_callback (abfd)
104 bfd *abfd;
105 {
106 struct internal_exec *execp = exec_hdr (abfd);
107 enum bfd_architecture arch;
108 long machine;
109
110 WORK_OUT_FILE_POSITIONS(abfd, execp);
111
112 /* Determine the architecture and machine type of the object file. */
113 switch (N_MACHTYPE (*exec_hdr (abfd))) {
114
115 case M_UNKNOWN:
116 arch = bfd_arch_unknown;
117 machine = 0;
118 break;
119
120 case M_68010:
121 case M_HP200:
122 arch = bfd_arch_m68k;
123 machine = 68010;
124 break;
125
126 case M_68020:
127 case M_HP300:
128 arch = bfd_arch_m68k;
129 machine = 68020;
130 break;
131
132 case M_SPARC:
133 arch = bfd_arch_sparc;
134 machine = 0;
135 break;
136
137 case M_386:
138 arch = bfd_arch_i386;
139 machine = 0;
140 break;
141
142 case M_29K:
143 arch = bfd_arch_a29k;
144 machine = 0;
145 break;
146
147 case M_HPUX:
148 arch = bfd_arch_m68k;
149 machine = 0;
150 break;
151
152 default:
153 arch = bfd_arch_obscure;
154 machine = 0;
155 break;
156 }
157 bfd_set_arch_mach(abfd, arch, machine);
158 choose_reloc_size(abfd);
159 adata(abfd)->page_size = PAGE_SIZE;
160 #ifdef SEGMENT_SIZE
161 adata(abfd)->segment_size = SEGMENT_SIZE;
162 #else
163 adata(abfd)->segment_size = PAGE_SIZE;
164 #endif
165 adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
166
167 return abfd->xvec;
168 }
169
170
171 static boolean
172 DEFUN(sunos_mkobject,(abfd),
173 bfd *abfd)
174 {
175 if (NAME(aout,mkobject)(abfd) == false)
176 return false;
177 adata(abfd)->page_size = PAGE_SIZE;
178 #ifdef SEGMENT_SIZE
179 adata(abfd)->page_size = SEGMENT_SIZE;
180 #else
181 adata(abfd)->segment_size = PAGE_SIZE;
182 #endif
183 adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
184 return true;
185 }
186
187 /* Write an object file in SunOS format.
188 Section contents have already been written. We write the
189 file header, symbols, and relocation. */
190
191 boolean
192 DEFUN(NAME(aout,sunos4_write_object_contents),
193 (abfd),
194 bfd *abfd)
195 {
196 bfd_size_type data_pad = 0;
197 struct external_exec exec_bytes;
198 struct internal_exec *execp = exec_hdr (abfd);
199
200 execp->a_text = obj_textsec (abfd)->size;
201
202 /* Magic number, maestro, please! */
203 switch (bfd_get_arch(abfd)) {
204 case bfd_arch_m68k:
205 switch (bfd_get_mach(abfd)) {
206 case 68010:
207 N_SET_MACHTYPE(*execp, M_68010);
208 break;
209 default:
210 case 68020:
211 N_SET_MACHTYPE(*execp, M_68020);
212 break;
213 }
214 break;
215 case bfd_arch_sparc:
216 N_SET_MACHTYPE(*execp, M_SPARC);
217 break;
218 case bfd_arch_i386:
219 N_SET_MACHTYPE(*execp, M_386);
220 break;
221 case bfd_arch_a29k:
222 N_SET_MACHTYPE(*execp, M_29K);
223 break;
224 default:
225 N_SET_MACHTYPE(*execp, M_UNKNOWN);
226 }
227
228 choose_reloc_size(abfd);
229
230 /* FIXME */
231 N_SET_FLAGS (*execp, 0x1);
232
233 WRITE_HEADERS(abfd, execp);
234
235 return true;
236 }
237 \f
238 /* core files */
239
240 #define CORE_MAGIC 0x080456
241 #define CORE_NAMELEN 16
242
243 /* The core structure is taken from the Sun documentation.
244 Unfortunately, they don't document the FPA structure, or at least I
245 can't find it easily. Fortunately the core header contains its own
246 length. So this shouldn't cause problems, except for c_ucode, which
247 so far we don't use but is easy to find with a little arithmetic. */
248
249 /* But the reg structure can be gotten from the SPARC processor handbook.
250 This really should be in a GNU include file though so that gdb can use
251 the same info. */
252 struct regs {
253 int r_psr;
254 int r_pc;
255 int r_npc;
256 int r_y;
257 int r_g1;
258 int r_g2;
259 int r_g3;
260 int r_g4;
261 int r_g5;
262 int r_g6;
263 int r_g7;
264 int r_o0;
265 int r_o1;
266 int r_o2;
267 int r_o3;
268 int r_o4;
269 int r_o5;
270 int r_o6;
271 int r_o7;
272 };
273
274 /* Taken from Sun documentation: */
275
276 /* FIXME: It's worse than we expect. This struct contains TWO substructs
277 neither of whose size we know, WITH STUFF IN BETWEEN THEM! We can't
278 even portably access the stuff in between! */
279
280 struct external_sparc_core {
281 int c_magic; /* Corefile magic number */
282 int c_len; /* Sizeof (struct core) */
283 #define SPARC_CORE_LEN 432
284 int c_regs[19]; /* General purpose registers -- MACHDEP SIZE */
285 struct external_exec c_aouthdr; /* A.out header */
286 int c_signo; /* Killing signal, if any */
287 int c_tsize; /* Text size (bytes) */
288 int c_dsize; /* Data size (bytes) */
289 int c_ssize; /* Stack size (bytes) */
290 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
291 double fp_stuff[1]; /* external FPU state (size unknown by us) */
292 /* The type "double" is critical here, for alignment.
293 SunOS declares a struct here, but the struct's alignment
294 is double since it contains doubles. */
295 int c_ucode; /* Exception no. from u_code */
296 /* (this member is not accessible by name since we don't
297 portably know the size of fp_stuff.) */
298 };
299
300 struct external_sun3_core {
301 int c_magic; /* Corefile magic number */
302 int c_len; /* Sizeof (struct core) */
303 #define SUN3_CORE_LEN 826 /* As of SunOS 4.1.1 */
304 int c_regs[18]; /* General purpose registers -- MACHDEP SIZE */
305 struct external_exec c_aouthdr; /* A.out header */
306 int c_signo; /* Killing signal, if any */
307 int c_tsize; /* Text size (bytes) */
308 int c_dsize; /* Data size (bytes) */
309 int c_ssize; /* Stack size (bytes) */
310 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
311 double fp_stuff[1]; /* external FPU state (size unknown by us) */
312 /* The type "double" is critical here, for alignment.
313 SunOS declares a struct here, but the struct's alignment
314 is double since it contains doubles. */
315 int c_ucode; /* Exception no. from u_code */
316 /* (this member is not accessible by name since we don't
317 portably know the size of fp_stuff.) */
318 };
319
320 struct internal_sunos_core {
321 int c_magic; /* Corefile magic number */
322 int c_len; /* Sizeof (struct core) */
323 long c_regs_pos; /* file offset of General purpose registers */
324 int c_regs_size; /* size of General purpose registers */
325 struct internal_exec c_aouthdr; /* A.out header */
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 long c_stacktop; /* Stack top (address) */
331 char c_cmdname[CORE_NAMELEN + 1]; /* Command name */
332 long fp_stuff_pos; /* file offset of external FPU state (regs) */
333 int fp_stuff_size; /* Size of it */
334 int c_ucode; /* Exception no. from u_code */
335 };
336
337 /* byte-swap in the Sun-3 core structure */
338 static void
339 DEFUN(swapcore_sun3,(abfd, ext, intcore),
340 bfd *abfd AND
341 char *ext AND
342 struct internal_sunos_core *intcore)
343 {
344 struct external_sun3_core *extcore = (struct external_sun3_core *)ext;
345
346 intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_magic);
347 intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_len );
348 intcore->c_regs_pos = (long) (((struct external_sun3_core *)0)->c_regs);
349 intcore->c_regs_size = sizeof (extcore->c_regs);
350 NAME(aout,swap_exec_header_in)(abfd, &extcore->c_aouthdr,&intcore->c_aouthdr);
351 intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_signo);
352 intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_tsize);
353 intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_dsize);
354 intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_ssize);
355 bcopy (extcore->c_cmdname, intcore->c_cmdname, sizeof (intcore->c_cmdname));
356 intcore->fp_stuff_pos = (long) (((struct external_sun3_core *)0)->fp_stuff);
357 /* FP stuff takes up whole rest of struct, except c_ucode. */
358 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
359 (file_ptr)(((struct external_sun3_core *)0)->fp_stuff);
360 /* Ucode is the last thing in the struct -- just before the end */
361 intcore->c_ucode =
362 bfd_h_get_32 (abfd,
363 intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *)extcore);
364 intcore->c_stacktop = 0x0E000000; /* By experimentation */
365 }
366
367
368 /* byte-swap in the Sparc core structure */
369 static void
370 DEFUN(swapcore_sparc,(abfd, ext, intcore),
371 bfd *abfd AND
372 char *ext AND
373 struct internal_sunos_core *intcore)
374 {
375 struct external_sparc_core *extcore = (struct external_sparc_core *)ext;
376
377 intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_magic);
378 intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_len );
379 intcore->c_regs_pos = (long) (((struct external_sparc_core *)0)->c_regs);
380 intcore->c_regs_size = sizeof (extcore->c_regs);
381 NAME(aout,swap_exec_header_in)(abfd, &extcore->c_aouthdr,&intcore->c_aouthdr);
382 intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_signo);
383 intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_tsize);
384 intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_dsize);
385 intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_ssize);
386 bcopy (extcore->c_cmdname, intcore->c_cmdname, sizeof (intcore->c_cmdname));
387 intcore->fp_stuff_pos = (long) (((struct external_sparc_core *)0)->fp_stuff);
388 /* FP stuff takes up whole rest of struct, except c_ucode. */
389 intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) -
390 (file_ptr)(((struct external_sparc_core *)0)->fp_stuff);
391 /* Ucode is the last thing in the struct -- just before the end */
392 intcore->c_ucode =
393 bfd_h_get_32 (abfd,
394 intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *)extcore);
395 /* Supposedly the user stack grows downward from the bottom of kernel memory.
396 Presuming that this remains true, this definition will work. */
397 #define SPARC_USRSTACK (-(128*1024*1024))
398 intcore->c_stacktop = SPARC_USRSTACK; /* By experimentation */
399 }
400
401 /* need this cast because ptr is really void * */
402 #define core_hdr(bfd) (((struct suncoredata *) (bfd->tdata))->hdr)
403 #define core_datasec(bfd) (((struct suncoredata *) ((bfd)->tdata))->data_section)
404 #define core_stacksec(bfd) (((struct suncoredata*)((bfd)->tdata))->stack_section)
405 #define core_regsec(bfd) (((struct suncoredata *) ((bfd)->tdata))->reg_section)
406 #define core_reg2sec(bfd) (((struct suncoredata *) ((bfd)->tdata))->reg2_section)
407
408 /* These are stored in the bfd's tdata */
409 struct suncoredata {
410 struct internal_sunos_core *hdr; /* core file header */
411 asection *data_section;
412 asection *stack_section;
413 asection *reg_section;
414 asection *reg2_section;
415 };
416
417 static bfd_target *
418 DEFUN(sunos4_core_file_p,(abfd),
419 bfd *abfd)
420 {
421 unsigned char longbuf[4]; /* Raw bytes of various header fields */
422 int core_size;
423 int core_mag;
424 struct internal_sunos_core *core;
425 char *extcore;
426 struct mergem {
427 struct suncoredata suncoredata;
428 struct internal_sunos_core internal_sunos_core;
429 char external_core[1];
430 } *mergem;
431
432 bfd_error = system_call_error;
433
434 if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) !=
435 sizeof (longbuf))
436 return 0;
437 core_mag = bfd_h_get_32 (abfd, longbuf);
438
439 if (core_mag != CORE_MAGIC) return 0;
440
441 /* SunOS core headers can vary in length; second word is size; */
442 if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) !=
443 sizeof (longbuf))
444 return 0;
445 core_size = bfd_h_get_32 (abfd, longbuf);
446 /* Sanity check */
447 if (core_size > 20000)
448 return 0;
449
450 if (bfd_seek (abfd, 0L, false) < 0) return 0;
451
452 mergem = (struct mergem *)bfd_zalloc (abfd, core_size + sizeof (struct mergem));
453 if (mergem == NULL) {
454 bfd_error = no_memory;
455 return 0;
456 }
457
458 extcore = mergem->external_core;
459
460 if ((bfd_read ((PTR) extcore, 1, core_size, abfd)) != core_size) {
461 bfd_error = system_call_error;
462 bfd_release (abfd, (char *)mergem);
463 return 0;
464 }
465
466 /* Validate that it's a core file we know how to handle, due to sun
467 botching the positioning of registers and other fields in a machine
468 dependent way. */
469 core = &mergem->internal_sunos_core;
470 switch (core_size) {
471 case SPARC_CORE_LEN:
472 swapcore_sparc (abfd, extcore, core);
473 break;
474 case SUN3_CORE_LEN:
475 swapcore_sun3 (abfd, extcore, core);
476 break;
477 default:
478 bfd_error = system_call_error; /* FIXME */
479 bfd_release (abfd, (char *)mergem);
480 return 0;
481 }
482
483 set_tdata (abfd, &mergem->suncoredata);
484 core_hdr (abfd) = core;
485
486 /* create the sections. This is raunchy, but bfd_close wants to reclaim
487 them */
488 core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
489 if (core_stacksec (abfd) == NULL) {
490 loser:
491 bfd_error = no_memory;
492 bfd_release (abfd, (char *)mergem);
493 return 0;
494 }
495 core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
496 if (core_datasec (abfd) == NULL) {
497 loser1:
498 bfd_release (abfd, core_stacksec (abfd));
499 goto loser;
500 }
501 core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
502 if (core_regsec (abfd) == NULL) {
503 loser2:
504 bfd_release (abfd, core_datasec (abfd));
505 goto loser1;
506 }
507 core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection));
508 if (core_reg2sec (abfd) == NULL) {
509 bfd_release (abfd, core_regsec (abfd));
510 goto loser2;
511 }
512
513 core_stacksec (abfd)->name = ".stack";
514 core_datasec (abfd)->name = ".data";
515 core_regsec (abfd)->name = ".reg";
516 core_reg2sec (abfd)->name = ".reg2";
517
518 core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
519 core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
520 core_regsec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
521 core_reg2sec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
522
523 core_stacksec (abfd)->size = core->c_ssize;
524 core_datasec (abfd)->size = core->c_dsize;
525 core_regsec (abfd)->size = core->c_regs_size;
526 core_reg2sec (abfd)->size = core->fp_stuff_size;
527
528 core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize);
529 core_datasec (abfd)->vma = N_DATADDR(core->c_aouthdr);
530 core_regsec (abfd)->vma = 0;
531 core_reg2sec (abfd)->vma = 0;
532
533 core_stacksec (abfd)->filepos = core->c_len + core->c_dsize;
534 core_datasec (abfd)->filepos = core->c_len;
535 /* We'll access the regs afresh in the core file, like any section: */
536 core_regsec (abfd)->filepos = (file_ptr)core->c_regs_pos;
537 core_reg2sec (abfd)->filepos = (file_ptr)core->fp_stuff_pos;
538
539 /* Align to word at least */
540 core_stacksec (abfd)->alignment_power = 2;
541 core_datasec (abfd)->alignment_power = 2;
542 core_regsec (abfd)->alignment_power = 2;
543 core_reg2sec (abfd)->alignment_power = 2;
544
545 abfd->sections = core_stacksec (abfd);
546 core_stacksec (abfd)->next = core_datasec (abfd);
547 core_datasec (abfd)->next = core_regsec (abfd);
548 core_regsec (abfd)->next = core_reg2sec (abfd);
549
550 abfd->section_count = 4;
551
552 return abfd->xvec;
553 }
554
555 static char *sunos4_core_file_failing_command (abfd)
556 bfd *abfd;
557 {
558 return core_hdr (abfd)->c_cmdname;
559 }
560
561 static int
562 DEFUN(sunos4_core_file_failing_signal,(abfd),
563 bfd *abfd)
564 {
565 return core_hdr (abfd)->c_signo;
566 }
567
568 static boolean
569 DEFUN(sunos4_core_file_matches_executable_p, (core_bfd, exec_bfd),
570 bfd *core_bfd AND
571 bfd *exec_bfd)
572 {
573 if (core_bfd->xvec != exec_bfd->xvec) {
574 bfd_error = system_call_error;
575 return false;
576 }
577
578 return (bcmp ((char *)&core_hdr (core_bfd)->c_aouthdr,
579 (char *) exec_hdr (exec_bfd),
580 sizeof (struct internal_exec)) == 0) ? true : false;
581 }
582 \f
583 /* We use BFD generic archive files. */
584 #define aout_32_openr_next_archived_file bfd_generic_openr_next_archived_file
585 #define aout_32_generic_stat_arch_elt bfd_generic_stat_arch_elt
586 #define aout_32_slurp_armap bfd_slurp_bsd_armap
587 #define aout_32_slurp_extended_name_table bfd_true
588 #define aout_32_write_armap bsd_write_armap
589 #define aout_32_truncate_arname bfd_bsd_truncate_arname
590 #define aout_32_machine_type sunos_machine_type
591
592 #define aout_32_core_file_failing_command sunos4_core_file_failing_command
593 #define aout_32_core_file_failing_signal sunos4_core_file_failing_signal
594 #define aout_32_core_file_matches_executable_p sunos4_core_file_matches_executable_p
595
596
597 #define aout_64_openr_next_archived_file bfd_generic_openr_next_archived_file
598 #define aout_64_generic_stat_arch_elt bfd_generic_stat_arch_elt
599 #define aout_64_slurp_armap bfd_slurp_bsd_armap
600 #define aout_64_slurp_extended_name_table bfd_true
601 #define aout_64_write_armap bsd_write_armap
602 #define aout_64_truncate_arname bfd_bsd_truncate_arname
603 #define aout_64_machine_type sunos_machine_type
604
605 #define aout_64_core_file_failing_command sunos4_core_file_failing_command
606 #define aout_64_core_file_failing_signal sunos4_core_file_failing_signal
607 #define aout_64_core_file_matches_executable_p sunos4_core_file_matches_executable_p
608
609 #define aout_64_bfd_debug_info_start bfd_void
610 #define aout_64_bfd_debug_info_end bfd_void
611 #define aout_64_bfd_debug_info_accumulate bfd_void
612
613 #define aout_32_bfd_debug_info_start bfd_void
614 #define aout_32_bfd_debug_info_end bfd_void
615 #define aout_32_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
616
617
618
619 /* We implement these routines ourselves, rather than using the generic
620 a.out versions. */
621 #define aout_write_object_contents sunos4_write_object_contents
622
623 bfd_target VECNAME =
624 {
625 TARGETNAME,
626 bfd_target_aout_flavour,
627 true, /* target byte order */
628 true, /* target headers byte order */
629 (HAS_RELOC | EXEC_P | /* object flags */
630 HAS_LINENO | HAS_DEBUG |
631 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
632 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
633 ' ', /* ar_pad_char */
634 16, /* ar_max_namelen */
635 3, /* minimum alignment power */
636 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
637 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
638
639 {_bfd_dummy_target, NAME(sunos,object_p),
640 bfd_generic_archive_p, sunos4_core_file_p},
641 {bfd_false, sunos_mkobject,
642 _bfd_generic_mkarchive, bfd_false},
643 {bfd_false, NAME(aout,sunos4_write_object_contents), /* bfd_write_contents */
644 _bfd_write_archive_contents, bfd_false},
645
646 JUMP_TABLE(JNAME(aout))
647 };