* configure.in (mips-*-riscos*): New target; use riscos.
[deliverable/binutils-gdb.git] / bfd / coff-mips.c
1 /* BFD back-end for MIPS Extended-Coff files.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Original version by Per Bothner.
4 Full support added by Ian Lance Taylor, ian@cygnus.com.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25 #include "seclet.h"
26 #include "aout/ar.h"
27 #include "aout/ranlib.h"
28
29 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
30 some other stuff which we don't want and which conflicts with stuff
31 we do want. */
32 #include "libaout.h"
33 #include "aout/aout64.h"
34 #undef OMAGIC
35 #undef ZMAGIC
36 #undef N_ABS
37 #undef exec_hdr
38 #undef obj_sym_filepos
39
40 #include "coff/mips.h"
41 #include "coff/internal.h"
42 #include "coff/sym.h"
43 #include "coff/symconst.h"
44 #include "coff/ecoff-ext.h"
45 #include "libcoff.h"
46 #include "libecoff.h"
47
48 /* Each canonical asymbol really looks like this. */
49
50 typedef struct ecoff_symbol_struct
51 {
52 /* The actual symbol which the rest of BFD works with */
53 asymbol symbol;
54
55 /* The fdr for this symbol. */
56 FDR *fdr;
57
58 /* true if this is a local symbol rather than an external one. */
59 boolean local;
60
61 /* A pointer to the unswapped hidden information for this symbol */
62 union
63 {
64 struct sym_ext *lnative;
65 struct ext_ext *enative;
66 }
67 native;
68 } ecoff_symbol_type;
69
70 /* We take the address of the first element of a asymbol to ensure that the
71 macro is only ever applied to an asymbol. */
72 #define ecoffsymbol(asymbol) ((ecoff_symbol_type *) (&((asymbol)->the_bfd)))
73
74 /* The page boundary used to align sections in the executable file. */
75 #define ROUND_SIZE 0x1000
76
77 /* The linker needs a section to hold small common variables while
78 linking. There is no convenient way to create it when the linker
79 needs it, so we always create one for each BFD. We then avoid
80 writing it out. */
81 #define SCOMMON ".scommon"
82
83 /* MIPS ECOFF has COFF sections, but the debugging information is
84 stored in a completely different format. This files uses the some
85 of the swapping routines from coffswap.h, and some of the generic
86 COFF routines in coffgen.c, but, unlike the real COFF targets, does
87 not use coffcode.h itself. */
88 \f
89 /* Prototypes for static functions. */
90
91 static boolean ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr));
92 static asection *ecoff_make_section_hook PARAMS ((bfd *abfd, char *name));
93 static boolean ecoff_new_section_hook PARAMS ((bfd *abfd, asection *section));
94 static boolean ecoff_mkobject PARAMS ((bfd *abfd));
95 static PTR ecoff_mkobject_hook PARAMS ((bfd *abfd, PTR filehdr, PTR aouthdr));
96 static boolean ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr));
97 static long ecoff_sec_to_styp_flags PARAMS ((CONST char *name,
98 flagword flags));
99 static flagword ecoff_styp_to_sec_flags PARAMS ((bfd *abfd, PTR hdr));
100 static asymbol *ecoff_make_empty_symbol PARAMS ((bfd *abfd));
101 static void ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym,
102 asymbol *asym, int ext,
103 asymbol **indirect_ptr_ptr));
104 static boolean ecoff_slurp_symbol_table PARAMS ((bfd *abfd));
105 static unsigned int ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd));
106 static unsigned int ecoff_get_symtab PARAMS ((bfd *abfd,
107 asymbol **alocation));
108 static void ecoff_emit_aggregate PARAMS ((bfd *abfd, char *string,
109 RNDXR *rndx, long isym,
110 CONST char *which));
111 static char *ecoff_type_to_string PARAMS ((bfd *abfd, union aux_ext *aux_ptr,
112 int indx, int bigendian));
113 static void ecoff_print_symbol PARAMS ((bfd *abfd, PTR filep,
114 asymbol *symbol,
115 bfd_print_symbol_type how));
116 static void ecoff_get_symbol_info PARAMS ((bfd *abfd,
117 asymbol *symbol,
118 symbol_info *ret));
119 static void ecoff_swap_reloc_in PARAMS ((bfd *abfd, RELOC *ext,
120 struct internal_reloc *intern));
121 static unsigned int ecoff_swap_reloc_out PARAMS ((bfd *abfd, PTR src,
122 PTR dst));
123 static bfd_reloc_status_type ecoff_generic_reloc PARAMS ((bfd *abfd,
124 arelent *reloc,
125 asymbol *symbol,
126 PTR data,
127 asection *section,
128 bfd *output_bfd));
129 static bfd_reloc_status_type ecoff_refhi_reloc PARAMS ((bfd *abfd,
130 arelent *reloc,
131 asymbol *symbol,
132 PTR data,
133 asection *section,
134 bfd *output_bfd));
135 static bfd_reloc_status_type ecoff_reflo_reloc PARAMS ((bfd *abfd,
136 arelent *reloc,
137 asymbol *symbol,
138 PTR data,
139 asection *section,
140 bfd *output_bfd));
141 static bfd_reloc_status_type ecoff_gprel_reloc PARAMS ((bfd *abfd,
142 arelent *reloc,
143 asymbol *symbol,
144 PTR data,
145 asection *section,
146 bfd *output_bfd));
147 static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section,
148 asymbol **symbols));
149 static unsigned int ecoff_canonicalize_reloc PARAMS ((bfd *abfd,
150 asection *section,
151 arelent **relptr,
152 asymbol **symbols));
153 static CONST struct reloc_howto_struct *ecoff_bfd_reloc_type_lookup
154 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
155 static boolean ecoff_find_nearest_line PARAMS ((bfd *abfd,
156 asection *section,
157 asymbol **symbols,
158 bfd_vma offset,
159 CONST char **filename_ptr,
160 CONST char **fnname_ptr,
161 unsigned int *retline_ptr));
162 static void ecoff_clear_output_flags PARAMS ((bfd *abfd));
163 static boolean ecoff_rel PARAMS ((bfd *output_bfd, bfd_seclet_type *seclet,
164 asection *output_section, PTR data,
165 boolean relocateable));
166 static boolean ecoff_dump_seclet PARAMS ((bfd *abfd, bfd_seclet_type *seclet,
167 asection *section, PTR data,
168 boolean relocateable));
169 static long ecoff_add_string PARAMS ((bfd *output_bfd, FDR *fdr,
170 CONST char *string, boolean external));
171 static boolean ecoff_get_debug PARAMS ((bfd *output_bfd,
172 bfd_seclet_type *seclet,
173 asection *section,
174 boolean relocateable));
175 static boolean ecoff_bfd_seclet_link PARAMS ((bfd *abfd, PTR data,
176 boolean relocateable));
177 static boolean ecoff_set_arch_mach PARAMS ((bfd *abfd,
178 enum bfd_architecture arch,
179 unsigned long machine));
180 static int ecoff_sizeof_headers PARAMS ((bfd *abfd, boolean reloc));
181 static void ecoff_compute_section_file_positions PARAMS ((bfd *abfd));
182 static boolean ecoff_set_section_contents PARAMS ((bfd *abfd,
183 asection *section,
184 PTR location,
185 file_ptr offset,
186 bfd_size_type count));
187 static boolean ecoff_write_object_contents PARAMS ((bfd *abfd));
188 static unsigned int ecoff_armap_hash PARAMS ((CONST char *s,
189 unsigned int *rehash,
190 unsigned int size,
191 unsigned int hlog));
192 static boolean ecoff_slurp_armap PARAMS ((bfd *abfd));
193 static boolean ecoff_write_armap PARAMS ((bfd *abfd, unsigned int elength,
194 struct orl *map,
195 unsigned int orl_count,
196 int stridx));
197 static bfd_target *ecoff_archive_p PARAMS ((bfd *abfd));
198 \f
199 /* Get the generic COFF swapping routines, except for the reloc,
200 symbol, and lineno ones. Give them ecoff names. */
201 #define MIPSECOFF
202 #define NO_COFF_RELOCS
203 #define NO_COFF_SYMBOLS
204 #define NO_COFF_LINENOS
205 #define coff_swap_filehdr_in ecoff_swap_filehdr_in
206 #define coff_swap_filehdr_out ecoff_swap_filehdr_out
207 #define coff_swap_aouthdr_in ecoff_swap_aouthdr_in
208 #define coff_swap_aouthdr_out ecoff_swap_aouthdr_out
209 #define coff_swap_scnhdr_in ecoff_swap_scnhdr_in
210 #define coff_swap_scnhdr_out ecoff_swap_scnhdr_out
211 #include "coffswap.h"
212 \f
213 /* How to process the various relocs types. */
214
215 static reloc_howto_type ecoff_howto_table[] =
216 {
217 /* Reloc type 0 is ignored. The reloc reading code ensures that
218 this is a reference to the .abs section, which will cause
219 bfd_perform_relocation to do nothing. */
220 HOWTO (ECOFF_R_IGNORE, /* type */
221 0, /* rightshift */
222 0, /* size (0 = byte, 1 = short, 2 = long) */
223 8, /* bitsize (obsolete) */
224 false, /* pc_relative */
225 0, /* bitpos */
226 false, /* absolute (obsolete) */
227 false, /* complain_on_overflow */
228 0, /* special_function */
229 "IGNORE", /* name */
230 false, /* partial_inplace */
231 0, /* src_mask */
232 0, /* dst_mask */
233 false), /* pcrel_offset */
234
235 /* A 16 bit reference to a symbol, normally from a data section. */
236 HOWTO (ECOFF_R_REFHALF, /* type */
237 0, /* rightshift */
238 1, /* size (0 = byte, 1 = short, 2 = long) */
239 16, /* bitsize (obsolete) */
240 false, /* pc_relative */
241 0, /* bitpos */
242 false, /* absolute (obsolete) */
243 true, /* complain_on_overflow */
244 ecoff_generic_reloc, /* special_function */
245 "REFHALF", /* name */
246 true, /* partial_inplace */
247 0xffff, /* src_mask */
248 0xffff, /* dst_mask */
249 false), /* pcrel_offset */
250
251 /* A 32 bit reference to a symbol, normally from a data section. */
252 HOWTO (ECOFF_R_REFWORD, /* type */
253 0, /* rightshift */
254 2, /* size (0 = byte, 1 = short, 2 = long) */
255 32, /* bitsize (obsolete) */
256 false, /* pc_relative */
257 0, /* bitpos */
258 false, /* absolute (obsolete) */
259 true, /* complain_on_overflow */
260 ecoff_generic_reloc, /* special_function */
261 "REFWORD", /* name */
262 true, /* partial_inplace */
263 0xffffffff, /* src_mask */
264 0xffffffff, /* dst_mask */
265 false), /* pcrel_offset */
266
267 /* A 26 bit absolute jump address. */
268 HOWTO (ECOFF_R_JMPADDR, /* type */
269 2, /* rightshift */
270 2, /* size (0 = byte, 1 = short, 2 = long) */
271 32, /* bitsize (obsolete) */
272 false, /* pc_relative */
273 0, /* bitpos */
274 false, /* absolute (obsolete) */
275 true, /* complain_on_overflow */
276 ecoff_generic_reloc, /* special_function */
277 "JMPADDR", /* name */
278 true, /* partial_inplace */
279 0x3ffffff, /* src_mask */
280 0x3ffffff, /* dst_mask */
281 false), /* pcrel_offset */
282
283 /* The high 16 bits of a symbol value. Handled by the function
284 ecoff_refhi_reloc. */
285 HOWTO (ECOFF_R_REFHI, /* type */
286 16, /* rightshift */
287 2, /* size (0 = byte, 1 = short, 2 = long) */
288 32, /* bitsize (obsolete) */
289 false, /* pc_relative */
290 0, /* bitpos */
291 false, /* absolute (obsolete) */
292 true, /* complain_on_overflow */
293 ecoff_refhi_reloc, /* special_function */
294 "REFHI", /* name */
295 true, /* partial_inplace */
296 0xffff, /* src_mask */
297 0xffff, /* dst_mask */
298 false), /* pcrel_offset */
299
300 /* The low 16 bits of a symbol value. */
301 HOWTO (ECOFF_R_REFLO, /* type */
302 0, /* rightshift */
303 2, /* size (0 = byte, 1 = short, 2 = long) */
304 32, /* bitsize (obsolete) */
305 false, /* pc_relative */
306 0, /* bitpos */
307 false, /* absolute (obsolete) */
308 true, /* complain_on_overflow */
309 ecoff_reflo_reloc, /* special_function */
310 "REFLO", /* name */
311 true, /* partial_inplace */
312 0xffff, /* src_mask */
313 0xffff, /* dst_mask */
314 false), /* pcrel_offset */
315
316 /* A reference to an offset from the gp register. Handled by the
317 function ecoff_gprel_reloc. */
318 HOWTO (ECOFF_R_GPREL, /* type */
319 0, /* rightshift */
320 2, /* size (0 = byte, 1 = short, 2 = long) */
321 32, /* bitsize (obsolete) */
322 false, /* pc_relative */
323 0, /* bitpos */
324 false, /* absolute (obsolete) */
325 true, /* complain_on_overflow */
326 ecoff_gprel_reloc, /* special_function */
327 "GPREL", /* name */
328 true, /* partial_inplace */
329 0xffff, /* src_mask */
330 0xffff, /* dst_mask */
331 false), /* pcrel_offset */
332
333 /* A reference to a literal using an offset from the gp register.
334 Handled by the function ecoff_gprel_reloc. */
335 HOWTO (ECOFF_R_LITERAL, /* type */
336 0, /* rightshift */
337 2, /* size (0 = byte, 1 = short, 2 = long) */
338 32, /* bitsize (obsolete) */
339 false, /* pc_relative */
340 0, /* bitpos */
341 false, /* absolute (obsolete) */
342 true, /* complain_on_overflow */
343 ecoff_gprel_reloc, /* special_function */
344 "LITERAL", /* name */
345 true, /* partial_inplace */
346 0xffff, /* src_mask */
347 0xffff, /* dst_mask */
348 false) /* pcrel_offset */
349 };
350
351 #define ECOFF_HOWTO_COUNT \
352 (sizeof ecoff_howto_table / sizeof ecoff_howto_table[0])
353 \f
354 /* This stuff is somewhat copied from coffcode.h. */
355
356 static asection bfd_debug_section = { "*DEBUG*" };
357
358 /* See whether the magic number matches. */
359
360 static boolean
361 ecoff_bad_format_hook (abfd, filehdr)
362 bfd *abfd;
363 PTR filehdr;
364 {
365 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
366
367 if (ECOFFBADMAG (*internal_f))
368 return false;
369
370 return true;
371 }
372
373 /* This is a hook needed by SCO COFF, but we have nothing to do. */
374
375 static asection *
376 ecoff_make_section_hook (abfd, name)
377 bfd *abfd;
378 char *name;
379 {
380 return (asection *) NULL;
381 }
382
383 /* Initialize a new section. */
384
385 static boolean
386 ecoff_new_section_hook (abfd, section)
387 bfd *abfd;
388 asection *section;
389 {
390 section->alignment_power = abfd->xvec->align_power_min;
391
392 if (strcmp (section->name, _TEXT) == 0)
393 section->flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
394 else if (strcmp (section->name, _DATA) == 0
395 || strcmp (section->name, _SDATA) == 0)
396 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
397 else if (strcmp (section->name, _RDATA) == 0
398 || strcmp (section->name, _LIT8) == 0
399 || strcmp (section->name, _LIT4) == 0)
400 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
401 else if (strcmp (section->name, _BSS) == 0
402 || strcmp (section->name, _SBSS) == 0)
403 section->flags |= SEC_ALLOC;
404
405 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
406 uncertain about .init on some systems and I don't know how shared
407 libraries work. */
408
409 return true;
410 }
411
412 /* Set the alignment of a section; we have nothing to do. */
413
414 #define ecoff_set_alignment_hook \
415 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
416
417 /* Create an ECOFF object. */
418
419 static boolean
420 ecoff_mkobject (abfd)
421 bfd *abfd;
422 {
423 abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *)
424 bfd_zalloc (abfd, sizeof (ecoff_data_type)));
425 if (abfd->tdata.ecoff_obj_data == NULL)
426 {
427 bfd_error = no_memory;
428 return false;
429 }
430
431 /* Always create a .scommon section for every BFD. This is a hack so
432 that the linker has something to attach scSCommon symbols to. */
433 bfd_make_section (abfd, SCOMMON);
434
435 return true;
436 }
437
438 /* Create the ECOFF backend specific information. */
439
440 static PTR
441 ecoff_mkobject_hook (abfd, filehdr, aouthdr)
442 bfd *abfd;
443 PTR filehdr;
444 PTR aouthdr;
445 {
446 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
447 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
448 ecoff_data_type *ecoff;
449
450 if (ecoff_mkobject (abfd) == false)
451 return NULL;
452
453 ecoff = ecoff_data (abfd);
454 ecoff->gp_size = 8;
455 ecoff->sym_filepos = internal_f->f_symptr;
456
457 if (internal_a != (struct internal_aouthdr *) NULL)
458 {
459 int i;
460
461 ecoff->text_start = internal_a->text_start;
462 ecoff->text_end = internal_a->text_start + internal_a->tsize;
463 ecoff->gp = internal_a->gp_value;
464 ecoff->gprmask = internal_a->gprmask;
465 for (i = 0; i < 4; i++)
466 ecoff->cprmask[i] = internal_a->cprmask[i];
467 if (internal_a->magic == ZMAGIC)
468 abfd->flags |= D_PAGED;
469 }
470
471 return (PTR) ecoff;
472 }
473
474 /* Determine the machine architecture and type. */
475
476 static boolean
477 ecoff_set_arch_mach_hook (abfd, filehdr)
478 bfd *abfd;
479 PTR filehdr;
480 {
481 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
482 enum bfd_architecture arch;
483
484 switch (internal_f->f_magic)
485 {
486 case MIPS_MAGIC_1:
487 case MIPS_MAGIC_LITTLE:
488 case MIPS_MAGIC_BIG:
489 arch = bfd_arch_mips;
490 break;
491
492 default:
493 arch = bfd_arch_obscure;
494 break;
495 }
496
497 bfd_default_set_arch_mach (abfd, arch, (unsigned long) 0);
498
499 return true;
500 }
501
502 /* Get the section s_flags to use for a section. */
503
504 static long
505 ecoff_sec_to_styp_flags (name, flags)
506 CONST char *name;
507 flagword flags;
508 {
509 long styp;
510
511 styp = 0;
512
513 if (strcmp (name, _TEXT) == 0)
514 styp = STYP_TEXT;
515 else if (strcmp (name, _DATA) == 0)
516 styp = STYP_DATA;
517 else if (strcmp (name, _SDATA) == 0)
518 styp = STYP_SDATA;
519 else if (strcmp (name, _RDATA) == 0)
520 styp = STYP_RDATA;
521 else if (strcmp (name, _LIT8) == 0)
522 styp = STYP_LIT8;
523 else if (strcmp (name, _LIT4) == 0)
524 styp = STYP_LIT4;
525 else if (strcmp (name, _BSS) == 0)
526 styp = STYP_BSS;
527 else if (strcmp (name, _SBSS) == 0)
528 styp = STYP_SBSS;
529 else if (strcmp (name, _INIT) == 0)
530 styp = STYP_MIPS_INIT;
531 else if (flags & SEC_CODE)
532 styp = STYP_TEXT;
533 else if (flags & SEC_DATA)
534 styp = STYP_DATA;
535 else if (flags & SEC_READONLY)
536 styp = STYP_RDATA;
537 else if (flags & SEC_LOAD)
538 styp = STYP_REG;
539 else
540 styp = STYP_BSS;
541
542 if (flags & SEC_NEVER_LOAD)
543 styp |= STYP_NOLOAD;
544
545 return styp;
546 }
547
548 /* Get the BFD flags to use for a section. */
549
550 static flagword
551 ecoff_styp_to_sec_flags (abfd, hdr)
552 bfd *abfd;
553 PTR hdr;
554 {
555 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
556 long styp_flags = internal_s->s_flags;
557 flagword sec_flags=0;
558
559 if (styp_flags & STYP_NOLOAD)
560 sec_flags |= SEC_NEVER_LOAD;
561
562 /* For 386 COFF, at least, an unloadable text or data section is
563 actually a shared library section. */
564 if ((styp_flags & STYP_TEXT)
565 || (styp_flags & STYP_MIPS_INIT))
566 {
567 if (sec_flags & SEC_NEVER_LOAD)
568 sec_flags |= SEC_CODE | SEC_SHARED_LIBRARY;
569 else
570 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
571 }
572 else if ((styp_flags & STYP_DATA)
573 || (styp_flags & STYP_RDATA)
574 || (styp_flags & STYP_SDATA))
575 {
576 if (sec_flags & SEC_NEVER_LOAD)
577 sec_flags |= SEC_DATA | SEC_SHARED_LIBRARY;
578 else
579 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
580 if (styp_flags & STYP_RDATA)
581 sec_flags |= SEC_READONLY;
582 }
583 else if ((styp_flags & STYP_BSS)
584 || (styp_flags & STYP_SBSS))
585 {
586 sec_flags |= SEC_ALLOC;
587 }
588 else if (styp_flags & STYP_INFO)
589 {
590 sec_flags |= SEC_NEVER_LOAD;
591 }
592 else if ((styp_flags & STYP_LIT8)
593 || (styp_flags & STYP_LIT4))
594 {
595 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
596 }
597 else
598 {
599 sec_flags |= SEC_ALLOC | SEC_LOAD;
600 }
601
602 return sec_flags;
603 }
604 \f
605 /* Read in and swap the important symbolic information for an ECOFF
606 object file. FIXME: This is called by gdb. If there is ever
607 another ECOFF target, it should be moved into some sort of target
608 specific structure. */
609
610 boolean
611 ecoff_slurp_symbolic_info (abfd)
612 bfd *abfd;
613 {
614 struct hdr_ext external_symhdr;
615 HDRR *internal_symhdr;
616 bfd_size_type raw_base;
617 bfd_size_type raw_size;
618 PTR raw;
619 struct fdr_ext *fraw_src;
620 struct fdr_ext *fraw_end;
621 struct fdr *fdr_ptr;
622
623 /* Check whether we've already gotten it, and whether there's any to
624 get. */
625 if (ecoff_data (abfd)->raw_syments != (PTR) NULL)
626 return true;
627 if (ecoff_data (abfd)->sym_filepos == 0)
628 {
629 bfd_get_symcount (abfd) = 0;
630 return true;
631 }
632
633 /* At this point bfd_get_symcount (abfd) holds the number of symbols
634 as read from the file header, but on ECOFF this is always the
635 size of the symbolic information header. It would be cleaner to
636 handle this when we first read the file in coffgen.c. */
637 if (bfd_get_symcount (abfd) != sizeof (external_symhdr))
638 {
639 bfd_error = bad_value;
640 return false;
641 }
642
643 /* Read the symbolic information header. */
644 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1
645 || (bfd_read ((PTR) &external_symhdr, sizeof (external_symhdr), 1, abfd)
646 != sizeof (external_symhdr)))
647 {
648 bfd_error = system_call_error;
649 return false;
650 }
651 internal_symhdr = &ecoff_data (abfd)->symbolic_header;
652 ecoff_swap_hdr_in (abfd, &external_symhdr, internal_symhdr);
653
654 if (internal_symhdr->magic != magicSym)
655 {
656 bfd_error = bad_value;
657 return false;
658 }
659
660 /* Now we can get the correct number of symbols. */
661 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
662 + internal_symhdr->iextMax);
663
664 /* Read all the symbolic information at once. */
665 raw_base = ecoff_data (abfd)->sym_filepos + sizeof (struct hdr_ext);
666
667 if (internal_symhdr->cbExtOffset != 0)
668 raw_size = (internal_symhdr->cbExtOffset
669 - raw_base
670 + internal_symhdr->iextMax * sizeof (struct ext_ext));
671 else
672 {
673 long cbline, issmax, issextmax;
674
675 cbline = (internal_symhdr->cbLine + 3) &~ 3;
676 issmax = (internal_symhdr->issMax + 3) &~ 3;
677 issextmax = (internal_symhdr->issExtMax + 3) &~ 3;
678 raw_size = (cbline * sizeof (unsigned char)
679 + internal_symhdr->idnMax * sizeof (struct dnr_ext)
680 + internal_symhdr->ipdMax * sizeof (struct pdr_ext)
681 + internal_symhdr->isymMax * sizeof (struct sym_ext)
682 + internal_symhdr->ioptMax * sizeof (struct opt_ext)
683 + internal_symhdr->iauxMax * sizeof (union aux_ext)
684 + issmax * sizeof (char)
685 + issextmax * sizeof (char)
686 + internal_symhdr->ifdMax * sizeof (struct fdr_ext)
687 + internal_symhdr->crfd * sizeof (struct rfd_ext)
688 + internal_symhdr->iextMax * sizeof (struct ext_ext));
689 }
690
691 if (raw_size == 0)
692 {
693 ecoff_data (abfd)->sym_filepos = 0;
694 return true;
695 }
696 raw = (PTR) bfd_alloc (abfd, raw_size);
697 if (raw == NULL)
698 {
699 bfd_error = no_memory;
700 return false;
701 }
702 if (bfd_read (raw, raw_size, 1, abfd) != raw_size)
703 {
704 bfd_error = system_call_error;
705 bfd_release (abfd, raw);
706 return false;
707 }
708
709 ecoff_data (abfd)->raw_size = raw_size;
710 ecoff_data (abfd)->raw_syments = raw;
711
712 /* Get pointers for the numeric offsets in the HDRR structure. */
713 #define FIX(off1, off2, type) \
714 if (internal_symhdr->off1 == 0) \
715 ecoff_data (abfd)->off2 = (type *) NULL; \
716 else \
717 ecoff_data (abfd)->off2 = (type *) ((char *) raw \
718 + internal_symhdr->off1 \
719 - raw_base)
720 FIX (cbLineOffset, line, unsigned char);
721 FIX (cbDnOffset, external_dnr, struct dnr_ext);
722 FIX (cbPdOffset, external_pdr, struct pdr_ext);
723 FIX (cbSymOffset, external_sym, struct sym_ext);
724 FIX (cbOptOffset, external_opt, struct opt_ext);
725 FIX (cbAuxOffset, external_aux, union aux_ext);
726 FIX (cbSsOffset, ss, char);
727 FIX (cbSsExtOffset, ssext, char);
728 FIX (cbFdOffset, external_fdr, struct fdr_ext);
729 FIX (cbRfdOffset, external_rfd, struct rfd_ext);
730 FIX (cbExtOffset, external_ext, struct ext_ext);
731 #undef FIX
732
733 /* I don't want to always swap all the data, because it will just
734 waste time and most programs will never look at it. The only
735 time the linker needs most of the debugging information swapped
736 is when linking big-endian and little-endian MIPS object files
737 together, which is not a common occurrence.
738
739 We need to look at the fdr to deal with a lot of information in
740 the symbols, so we swap them here. */
741 ecoff_data (abfd)->fdr = (struct fdr *) bfd_alloc (abfd,
742 (internal_symhdr->ifdMax *
743 sizeof (struct fdr)));
744 if (ecoff_data (abfd)->fdr == NULL)
745 {
746 bfd_error = no_memory;
747 return false;
748 }
749 fdr_ptr = ecoff_data (abfd)->fdr;
750 fraw_src = ecoff_data (abfd)->external_fdr;
751 fraw_end = fraw_src + internal_symhdr->ifdMax;
752 for (; fraw_src < fraw_end; fraw_src++, fdr_ptr++)
753 ecoff_swap_fdr_in (abfd, fraw_src, fdr_ptr);
754
755 return true;
756 }
757 \f
758 /* ECOFF symbol table routines. The ECOFF symbol table is described
759 in gcc/mips-tfile.c. */
760
761 /* ECOFF uses two common sections. One is the usual one, and the
762 other is for small objects. All the small objects are kept
763 together, and then referenced via the gp pointer, which yields
764 faster assembler code. This is what we use for the small common
765 section. */
766 static asection ecoff_scom_section;
767 static asymbol ecoff_scom_symbol;
768 static asymbol *ecoff_scom_symbol_ptr;
769
770 /* Create an empty symbol. */
771
772 static asymbol *
773 ecoff_make_empty_symbol (abfd)
774 bfd *abfd;
775 {
776 ecoff_symbol_type *new;
777
778 new = (ecoff_symbol_type *) bfd_alloc (abfd, sizeof (ecoff_symbol_type));
779 if (new == (ecoff_symbol_type *) NULL)
780 {
781 bfd_error = no_memory;
782 return (asymbol *) NULL;
783 }
784 memset (new, 0, sizeof *new);
785 new->symbol.section = (asection *) NULL;
786 new->fdr = (FDR *) NULL;
787 new->local = false;
788 new->native.lnative = (struct sym_ext *) NULL;
789 new->symbol.the_bfd = abfd;
790 return &new->symbol;
791 }
792
793 /* Set the BFD flags and section for an ECOFF symbol. */
794
795 static void
796 ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext, indirect_ptr_ptr)
797 bfd *abfd;
798 SYMR *ecoff_sym;
799 asymbol *asym;
800 int ext;
801 asymbol **indirect_ptr_ptr;
802 {
803 asym->the_bfd = abfd;
804 asym->value = ecoff_sym->value;
805 asym->section = &bfd_debug_section;
806 asym->udata = NULL;
807
808 /* An indirect symbol requires two consecutive stabs symbols. */
809 if (*indirect_ptr_ptr != (asymbol *) NULL)
810 {
811 BFD_ASSERT (MIPS_IS_STAB (ecoff_sym));
812 (*indirect_ptr_ptr)->value = (bfd_vma) asym;
813 asym->flags = BSF_DEBUGGING;
814 asym->section = &bfd_und_section;
815 *indirect_ptr_ptr = NULL;
816 return;
817 }
818
819 if (MIPS_IS_STAB (ecoff_sym)
820 && (MIPS_UNMARK_STAB (ecoff_sym->index) | N_EXT) == (N_INDR | N_EXT))
821 {
822 asym->flags = BSF_DEBUGGING | BSF_INDIRECT;
823 asym->section = &bfd_ind_section;
824 /* Pass this symbol on to the next call to this function. */
825 *indirect_ptr_ptr = asym;
826 return;
827 }
828
829 /* Most symbol types are just for debugging. */
830 switch (ecoff_sym->st)
831 {
832 case stGlobal:
833 case stStatic:
834 case stLabel:
835 case stProc:
836 case stStaticProc:
837 break;
838 case stNil:
839 if (MIPS_IS_STAB (ecoff_sym))
840 {
841 asym->flags = BSF_DEBUGGING;
842 return;
843 }
844 break;
845 default:
846 asym->flags = BSF_DEBUGGING;
847 return;
848 }
849
850 if (ext)
851 asym->flags = BSF_EXPORT | BSF_GLOBAL;
852 else
853 asym->flags = BSF_LOCAL;
854 switch (ecoff_sym->sc)
855 {
856 case scNil:
857 /* Used for compiler generated labels. Leave them in the
858 debugging section, and mark them as local. If BSF_DEBUGGING
859 is set, then nm does not display them for some reason. If no
860 flags are set then the linker whines about them. */
861 asym->flags = BSF_LOCAL;
862 break;
863 case scText:
864 asym->section = bfd_make_section_old_way (abfd, ".text");
865 asym->value -= asym->section->vma;
866 break;
867 case scData:
868 asym->section = bfd_make_section_old_way (abfd, ".data");
869 asym->value -= asym->section->vma;
870 break;
871 case scBss:
872 if (ext)
873 {
874 asym->section = &bfd_com_section;
875 asym->flags = 0;
876 }
877 else
878 {
879 asym->section = bfd_make_section_old_way (abfd, ".bss");
880 asym->value -= asym->section->vma;
881 }
882 break;
883 case scRegister:
884 asym->flags = BSF_DEBUGGING;
885 break;
886 case scAbs:
887 asym->section = &bfd_abs_section;
888 break;
889 case scUndefined:
890 asym->section = &bfd_und_section;
891 asym->flags = 0;
892 asym->value = 0;
893 break;
894 case scCdbLocal:
895 case scBits:
896 case scCdbSystem:
897 case scRegImage:
898 case scInfo:
899 case scUserStruct:
900 asym->flags = BSF_DEBUGGING;
901 break;
902 case scSData:
903 asym->section = bfd_make_section_old_way (abfd, ".sdata");
904 asym->value -= asym->section->vma;
905 break;
906 case scSBss:
907 asym->section = bfd_make_section_old_way (abfd, ".sbss");
908 if (! ext)
909 asym->value -= asym->section->vma;
910 break;
911 case scRData:
912 asym->section = bfd_make_section_old_way (abfd, ".rdata");
913 asym->value -= asym->section->vma;
914 break;
915 case scVar:
916 asym->flags = BSF_DEBUGGING;
917 break;
918 case scCommon:
919 if (asym->value > ecoff_data (abfd)->gp_size)
920 {
921 asym->section = &bfd_com_section;
922 asym->flags = 0;
923 break;
924 }
925 /* Fall through. */
926 case scSCommon:
927 if (ecoff_scom_section.name == NULL)
928 {
929 /* Initialize the small common section. */
930 ecoff_scom_section.name = SCOMMON;
931 ecoff_scom_section.flags = SEC_IS_COMMON;
932 ecoff_scom_section.output_section = &ecoff_scom_section;
933 ecoff_scom_section.symbol = &ecoff_scom_symbol;
934 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
935 ecoff_scom_symbol.name = SCOMMON;
936 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
937 ecoff_scom_symbol.section = &ecoff_scom_section;
938 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
939 }
940 asym->section = &ecoff_scom_section;
941 asym->flags = 0;
942 break;
943 case scVarRegister:
944 case scVariant:
945 asym->flags = BSF_DEBUGGING;
946 break;
947 case scSUndefined:
948 asym->section = &bfd_und_section;
949 asym->flags = 0;
950 asym->value = 0;
951 break;
952 case scInit:
953 asym->section = bfd_make_section_old_way (abfd, ".init");
954 asym->value -= asym->section->vma;
955 break;
956 case scBasedVar:
957 case scXData:
958 case scPData:
959 asym->flags = BSF_DEBUGGING;
960 break;
961 case scFini:
962 asym->section = bfd_make_section_old_way (abfd, ".fini");
963 asym->value -= asym->section->vma;
964 break;
965 default:
966 break;
967 }
968
969 /* Look for special constructors symbols and make relocation entries
970 in a special construction section. These are produced by the
971 -fgnu-linker argument to g++. */
972 if (MIPS_IS_STAB (ecoff_sym))
973 {
974 switch (MIPS_UNMARK_STAB (ecoff_sym->index))
975 {
976 default:
977 break;
978
979 case N_SETA:
980 case N_SETT:
981 case N_SETD:
982 case N_SETB:
983 {
984 const char *name;
985 asection *section;
986 arelent_chain *reloc_chain;
987
988 /* Get a section with the same name as the symbol (usually
989 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
990 name ___CTOR_LIST (three underscores). We need
991 __CTOR_LIST (two underscores), since ECOFF doesn't use
992 a leading underscore. This should be handled by gcc,
993 but instead we do it here. Actually, this should all
994 be done differently anyhow. */
995 name = bfd_asymbol_name (asym);
996 if (name[0] == '_' && name[1] == '_' && name[2] == '_')
997 {
998 ++name;
999 asym->name = name;
1000 }
1001 section = bfd_get_section_by_name (abfd, name);
1002 if (section == (asection *) NULL)
1003 {
1004 char *copy;
1005
1006 copy = (char *) bfd_alloc (abfd, strlen (name) + 1);
1007 strcpy (copy, name);
1008 section = bfd_make_section (abfd, copy);
1009 }
1010
1011 /* Build a reloc pointing to this constructor. */
1012 reloc_chain = (arelent_chain *) bfd_alloc (abfd,
1013 sizeof (arelent_chain));
1014 reloc_chain->relent.sym_ptr_ptr =
1015 bfd_get_section (asym)->symbol_ptr_ptr;
1016 reloc_chain->relent.address = section->_raw_size;
1017 reloc_chain->relent.addend = asym->value;
1018
1019 /* FIXME: Assumes 32 bit __CTOR_LIST__ entries. */
1020 reloc_chain->relent.howto = ecoff_howto_table + ECOFF_R_REFWORD;
1021
1022 /* Set up the constructor section to hold the reloc. */
1023 section->flags = SEC_CONSTRUCTOR;
1024 ++section->reloc_count;
1025
1026 /* Constructor sections must be rounded to a four byte
1027 boundary (FIXME: assuming 32 bit entries). These are
1028 not real sections--they are handled specially by the
1029 linker--so the ECOFF 16 byte alignment restriction does
1030 not apply. */
1031 section->alignment_power = 2;
1032
1033 reloc_chain->next = section->constructor_chain;
1034 section->constructor_chain = reloc_chain;
1035
1036 /* FIXME: Assumes 32 bit __CTOR_LIST__ entries. */
1037 section->_raw_size += 4;
1038
1039 /* Mark the symbol as a constructor. */
1040 asym->flags |= BSF_CONSTRUCTOR;
1041 }
1042 break;
1043 }
1044 }
1045 }
1046
1047 /* Read an ECOFF symbol table. */
1048
1049 static boolean
1050 ecoff_slurp_symbol_table (abfd)
1051 bfd *abfd;
1052 {
1053 bfd_size_type internal_size;
1054 ecoff_symbol_type *internal;
1055 ecoff_symbol_type *internal_ptr;
1056 asymbol *indirect_ptr;
1057 struct ext_ext *eraw_src;
1058 struct ext_ext *eraw_end;
1059 FDR *fdr_ptr;
1060 FDR *fdr_end;
1061
1062 /* If we've already read in the symbol table, do nothing. */
1063 if (ecoff_data (abfd)->canonical_symbols != NULL)
1064 return true;
1065
1066 /* Get the symbolic information. */
1067 if (ecoff_slurp_symbolic_info (abfd) == false)
1068 return false;
1069 if (bfd_get_symcount (abfd) == 0)
1070 return true;
1071
1072 internal_size = bfd_get_symcount (abfd) * sizeof (ecoff_symbol_type);
1073 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
1074 if (internal == NULL)
1075 {
1076 bfd_error = no_memory;
1077 return false;
1078 }
1079
1080 internal_ptr = internal;
1081 indirect_ptr = NULL;
1082 eraw_src = ecoff_data (abfd)->external_ext;
1083 eraw_end = eraw_src + ecoff_data (abfd)->symbolic_header.iextMax;
1084 for (; eraw_src < eraw_end; eraw_src++, internal_ptr++)
1085 {
1086 EXTR internal_esym;
1087
1088 ecoff_swap_ext_in (abfd, eraw_src, &internal_esym);
1089 internal_ptr->symbol.name = (ecoff_data (abfd)->ssext
1090 + internal_esym.asym.iss);
1091 ecoff_set_symbol_info (abfd, &internal_esym.asym,
1092 &internal_ptr->symbol, 1, &indirect_ptr);
1093 internal_ptr->fdr = ecoff_data (abfd)->fdr + internal_esym.ifd;
1094 internal_ptr->local = false;
1095 internal_ptr->native.enative = eraw_src;
1096 }
1097 BFD_ASSERT (indirect_ptr == (asymbol *) NULL);
1098
1099 /* The local symbols must be accessed via the fdr's, because the
1100 string and aux indices are relative to the fdr information. */
1101 fdr_ptr = ecoff_data (abfd)->fdr;
1102 fdr_end = fdr_ptr + ecoff_data (abfd)->symbolic_header.ifdMax;
1103 for (; fdr_ptr < fdr_end; fdr_ptr++)
1104 {
1105 struct sym_ext *lraw_src;
1106 struct sym_ext *lraw_end;
1107
1108 lraw_src = ecoff_data (abfd)->external_sym + fdr_ptr->isymBase;
1109 lraw_end = lraw_src + fdr_ptr->csym;
1110 for (; lraw_src < lraw_end; lraw_src++, internal_ptr++)
1111 {
1112 SYMR internal_sym;
1113
1114 ecoff_swap_sym_in (abfd, lraw_src, &internal_sym);
1115 internal_ptr->symbol.name = (ecoff_data (abfd)->ss
1116 + fdr_ptr->issBase
1117 + internal_sym.iss);
1118 ecoff_set_symbol_info (abfd, &internal_sym,
1119 &internal_ptr->symbol, 0, &indirect_ptr);
1120 internal_ptr->fdr = fdr_ptr;
1121 internal_ptr->local = true;
1122 internal_ptr->native.lnative = lraw_src;
1123 }
1124 }
1125 BFD_ASSERT (indirect_ptr == (asymbol *) NULL);
1126
1127 ecoff_data (abfd)->canonical_symbols = internal;
1128
1129 return true;
1130 }
1131
1132 static unsigned int
1133 ecoff_get_symtab_upper_bound (abfd)
1134 bfd *abfd;
1135 {
1136 if (ecoff_slurp_symbolic_info (abfd) == false
1137 || bfd_get_symcount (abfd) == 0)
1138 return 0;
1139
1140 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
1141 }
1142
1143 static unsigned int
1144 ecoff_get_symtab (abfd, alocation)
1145 bfd *abfd;
1146 asymbol **alocation;
1147 {
1148 unsigned int counter = 0;
1149 ecoff_symbol_type *symbase;
1150 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
1151
1152 if (ecoff_slurp_symbol_table (abfd) == false
1153 || bfd_get_symcount (abfd) == 0)
1154 return 0;
1155
1156 symbase = ecoff_data (abfd)->canonical_symbols;
1157 while (counter < bfd_get_symcount (abfd))
1158 {
1159 *(location++) = symbase++;
1160 counter++;
1161 }
1162 *location++ = (ecoff_symbol_type *) NULL;
1163 return bfd_get_symcount (abfd);
1164 }
1165
1166 /* Turn ECOFF type information into a printable string.
1167 ecoff_emit_aggregate and ecoff_type_to_string are from
1168 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1169
1170 /* Write aggregate information to a string. */
1171
1172 static void
1173 ecoff_emit_aggregate (abfd, string, rndx, isym, which)
1174 bfd *abfd;
1175 char *string;
1176 RNDXR *rndx;
1177 long isym;
1178 CONST char *which;
1179 {
1180 int ifd = rndx->rfd;
1181 int indx = rndx->index;
1182 int sym_base, ss_base;
1183 CONST char *name;
1184
1185 if (ifd == 0xfff)
1186 ifd = isym;
1187
1188 sym_base = ecoff_data (abfd)->fdr[ifd].isymBase;
1189 ss_base = ecoff_data (abfd)->fdr[ifd].issBase;
1190
1191 if (indx == indexNil)
1192 name = "/* no name */";
1193 else
1194 {
1195 SYMR sym;
1196
1197 indx += sym_base;
1198 ecoff_swap_sym_in (abfd,
1199 ecoff_data (abfd)->external_sym + indx,
1200 &sym);
1201 name = ecoff_data (abfd)->ss + ss_base + sym.iss;
1202 }
1203
1204 sprintf (string,
1205 "%s %s { ifd = %d, index = %d }",
1206 which, name, ifd,
1207 indx + ecoff_data (abfd)->symbolic_header.iextMax);
1208 }
1209
1210 /* Convert the type information to string format. */
1211
1212 static char *
1213 ecoff_type_to_string (abfd, aux_ptr, indx, bigendian)
1214 bfd *abfd;
1215 union aux_ext *aux_ptr;
1216 int indx;
1217 int bigendian;
1218 {
1219 AUXU u;
1220 struct qual {
1221 unsigned int type;
1222 int low_bound;
1223 int high_bound;
1224 int stride;
1225 } qualifiers[7];
1226
1227 unsigned int basic_type;
1228 int i;
1229 static char buffer1[1024];
1230 static char buffer2[1024];
1231 char *p1 = buffer1;
1232 char *p2 = buffer2;
1233 RNDXR rndx;
1234
1235 for (i = 0; i < 7; i++)
1236 {
1237 qualifiers[i].low_bound = 0;
1238 qualifiers[i].high_bound = 0;
1239 qualifiers[i].stride = 0;
1240 }
1241
1242 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == -1)
1243 return "-1 (no type)";
1244 ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1245
1246 basic_type = u.ti.bt;
1247 qualifiers[0].type = u.ti.tq0;
1248 qualifiers[1].type = u.ti.tq1;
1249 qualifiers[2].type = u.ti.tq2;
1250 qualifiers[3].type = u.ti.tq3;
1251 qualifiers[4].type = u.ti.tq4;
1252 qualifiers[5].type = u.ti.tq5;
1253 qualifiers[6].type = tqNil;
1254
1255 /*
1256 * Go get the basic type.
1257 */
1258 switch (basic_type)
1259 {
1260 case btNil: /* undefined */
1261 strcpy (p1, "nil");
1262 break;
1263
1264 case btAdr: /* address - integer same size as pointer */
1265 strcpy (p1, "address");
1266 break;
1267
1268 case btChar: /* character */
1269 strcpy (p1, "char");
1270 break;
1271
1272 case btUChar: /* unsigned character */
1273 strcpy (p1, "unsigned char");
1274 break;
1275
1276 case btShort: /* short */
1277 strcpy (p1, "short");
1278 break;
1279
1280 case btUShort: /* unsigned short */
1281 strcpy (p1, "unsigned short");
1282 break;
1283
1284 case btInt: /* int */
1285 strcpy (p1, "int");
1286 break;
1287
1288 case btUInt: /* unsigned int */
1289 strcpy (p1, "unsigned int");
1290 break;
1291
1292 case btLong: /* long */
1293 strcpy (p1, "long");
1294 break;
1295
1296 case btULong: /* unsigned long */
1297 strcpy (p1, "unsigned long");
1298 break;
1299
1300 case btFloat: /* float (real) */
1301 strcpy (p1, "float");
1302 break;
1303
1304 case btDouble: /* Double (real) */
1305 strcpy (p1, "double");
1306 break;
1307
1308 /* Structures add 1-2 aux words:
1309 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1310 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1311
1312 case btStruct: /* Structure (Record) */
1313 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1314 ecoff_emit_aggregate (abfd, p1, &rndx,
1315 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1316 "struct");
1317 indx++; /* skip aux words */
1318 break;
1319
1320 /* Unions add 1-2 aux words:
1321 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1322 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1323
1324 case btUnion: /* Union */
1325 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1326 ecoff_emit_aggregate (abfd, p1, &rndx,
1327 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1328 "union");
1329 indx++; /* skip aux words */
1330 break;
1331
1332 /* Enumerations add 1-2 aux words:
1333 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1334 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1335
1336 case btEnum: /* Enumeration */
1337 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1338 ecoff_emit_aggregate (abfd, p1, &rndx,
1339 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1340 "enum");
1341 indx++; /* skip aux words */
1342 break;
1343
1344 case btTypedef: /* defined via a typedef, isymRef points */
1345 strcpy (p1, "typedef");
1346 break;
1347
1348 case btRange: /* subrange of int */
1349 strcpy (p1, "subrange");
1350 break;
1351
1352 case btSet: /* pascal sets */
1353 strcpy (p1, "set");
1354 break;
1355
1356 case btComplex: /* fortran complex */
1357 strcpy (p1, "complex");
1358 break;
1359
1360 case btDComplex: /* fortran double complex */
1361 strcpy (p1, "double complex");
1362 break;
1363
1364 case btIndirect: /* forward or unnamed typedef */
1365 strcpy (p1, "forward/unamed typedef");
1366 break;
1367
1368 case btFixedDec: /* Fixed Decimal */
1369 strcpy (p1, "fixed decimal");
1370 break;
1371
1372 case btFloatDec: /* Float Decimal */
1373 strcpy (p1, "float decimal");
1374 break;
1375
1376 case btString: /* Varying Length Character String */
1377 strcpy (p1, "string");
1378 break;
1379
1380 case btBit: /* Aligned Bit String */
1381 strcpy (p1, "bit");
1382 break;
1383
1384 case btPicture: /* Picture */
1385 strcpy (p1, "picture");
1386 break;
1387
1388 case btVoid: /* Void */
1389 strcpy (p1, "void");
1390 break;
1391
1392 default:
1393 sprintf (p1, "Unknown basic type %d", (int) basic_type);
1394 break;
1395 }
1396
1397 p1 += strlen (buffer1);
1398
1399 /*
1400 * If this is a bitfield, get the bitsize.
1401 */
1402 if (u.ti.fBitfield)
1403 {
1404 int bitsize;
1405
1406 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1407 sprintf (p1, " : %d", bitsize);
1408 p1 += strlen (buffer1);
1409 }
1410
1411
1412 /*
1413 * Deal with any qualifiers.
1414 */
1415 if (qualifiers[0].type != tqNil)
1416 {
1417 /*
1418 * Snarf up any array bounds in the correct order. Arrays
1419 * store 5 successive words in the aux. table:
1420 * word 0 RNDXR to type of the bounds (ie, int)
1421 * word 1 Current file descriptor index
1422 * word 2 low bound
1423 * word 3 high bound (or -1 if [])
1424 * word 4 stride size in bits
1425 */
1426 for (i = 0; i < 7; i++)
1427 {
1428 if (qualifiers[i].type == tqArray)
1429 {
1430 qualifiers[i].low_bound =
1431 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1432 qualifiers[i].high_bound =
1433 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1434 qualifiers[i].stride =
1435 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1436 indx += 5;
1437 }
1438 }
1439
1440 /*
1441 * Now print out the qualifiers.
1442 */
1443 for (i = 0; i < 6; i++)
1444 {
1445 switch (qualifiers[i].type)
1446 {
1447 case tqNil:
1448 case tqMax:
1449 break;
1450
1451 case tqPtr:
1452 strcpy (p2, "ptr to ");
1453 p2 += sizeof ("ptr to ")-1;
1454 break;
1455
1456 case tqVol:
1457 strcpy (p2, "volatile ");
1458 p2 += sizeof ("volatile ")-1;
1459 break;
1460
1461 case tqFar:
1462 strcpy (p2, "far ");
1463 p2 += sizeof ("far ")-1;
1464 break;
1465
1466 case tqProc:
1467 strcpy (p2, "func. ret. ");
1468 p2 += sizeof ("func. ret. ");
1469 break;
1470
1471 case tqArray:
1472 {
1473 int first_array = i;
1474 int j;
1475
1476 /* Print array bounds reversed (ie, in the order the C
1477 programmer writes them). C is such a fun language.... */
1478
1479 while (i < 5 && qualifiers[i+1].type == tqArray)
1480 i++;
1481
1482 for (j = i; j >= first_array; j--)
1483 {
1484 strcpy (p2, "array [");
1485 p2 += sizeof ("array [")-1;
1486 if (qualifiers[j].low_bound != 0)
1487 sprintf (p2,
1488 "%ld:%ld {%ld bits}",
1489 (long) qualifiers[j].low_bound,
1490 (long) qualifiers[j].high_bound,
1491 (long) qualifiers[j].stride);
1492
1493 else if (qualifiers[j].high_bound != -1)
1494 sprintf (p2,
1495 "%ld {%ld bits}",
1496 (long) (qualifiers[j].high_bound + 1),
1497 (long) (qualifiers[j].stride));
1498
1499 else
1500 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1501
1502 p2 += strlen (p2);
1503 strcpy (p2, "] of ");
1504 p2 += sizeof ("] of ")-1;
1505 }
1506 }
1507 break;
1508 }
1509 }
1510 }
1511
1512 strcpy (p2, buffer1);
1513 return buffer2;
1514 }
1515
1516 /* Return information about ECOFF symbol SYMBOL in RET. */
1517
1518 static void
1519 ecoff_get_symbol_info (abfd, symbol, ret)
1520 bfd *abfd; /* Ignored. */
1521 asymbol *symbol;
1522 symbol_info *ret;
1523 {
1524 bfd_symbol_info (symbol, ret);
1525 }
1526
1527 /* Print information about an ECOFF symbol. */
1528
1529 static void
1530 ecoff_print_symbol (abfd, filep, symbol, how)
1531 bfd *abfd;
1532 PTR filep;
1533 asymbol *symbol;
1534 bfd_print_symbol_type how;
1535 {
1536 FILE *file = (FILE *)filep;
1537
1538 switch (how)
1539 {
1540 case bfd_print_symbol_name:
1541 fprintf (file, "%s", symbol->name);
1542 break;
1543 case bfd_print_symbol_more:
1544 if (ecoffsymbol (symbol)->local)
1545 {
1546 SYMR ecoff_sym;
1547
1548 ecoff_swap_sym_in (abfd, ecoffsymbol (symbol)->native.lnative,
1549 &ecoff_sym);
1550 fprintf (file, "ecoff local %lx %x %x",
1551 (unsigned long) ecoff_sym.value,
1552 (unsigned) ecoff_sym.st, (unsigned) ecoff_sym.sc);
1553 }
1554 else
1555 {
1556 EXTR ecoff_ext;
1557
1558 ecoff_swap_ext_in (abfd, ecoffsymbol (symbol)->native.enative,
1559 &ecoff_ext);
1560 fprintf (file, "ecoff extern %lx %x %x",
1561 (unsigned long) ecoff_ext.asym.value,
1562 (unsigned) ecoff_ext.asym.st,
1563 (unsigned) ecoff_ext.asym.sc);
1564 }
1565 break;
1566 case bfd_print_symbol_all:
1567 /* Print out the symbols in a reasonable way */
1568 {
1569 char type;
1570 int pos;
1571 EXTR ecoff_ext;
1572 char jmptbl;
1573 char cobol_main;
1574 char weakext;
1575
1576 if (ecoffsymbol (symbol)->local)
1577 {
1578 ecoff_swap_sym_in (abfd, ecoffsymbol (symbol)->native.lnative,
1579 &ecoff_ext.asym);
1580 type = 'l';
1581 pos = (ecoffsymbol (symbol)->native.lnative
1582 - ecoff_data (abfd)->external_sym
1583 + ecoff_data (abfd)->symbolic_header.iextMax);
1584 jmptbl = ' ';
1585 cobol_main = ' ';
1586 weakext = ' ';
1587 }
1588 else
1589 {
1590 ecoff_swap_ext_in (abfd, ecoffsymbol (symbol)->native.enative,
1591 &ecoff_ext);
1592 type = 'e';
1593 pos = (ecoffsymbol (symbol)->native.enative
1594 - ecoff_data (abfd)->external_ext);
1595 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1596 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1597 weakext = ecoff_ext.weakext ? 'w' : ' ';
1598 }
1599
1600 fprintf (file, "[%3d] %c %lx st %x sc %x indx %x %c%c%c %s",
1601 pos, type, (unsigned long) ecoff_ext.asym.value,
1602 (unsigned) ecoff_ext.asym.st,
1603 (unsigned) ecoff_ext.asym.sc,
1604 (unsigned) ecoff_ext.asym.index,
1605 jmptbl, cobol_main, weakext,
1606 symbol->name);
1607
1608 if (ecoffsymbol (symbol)->fdr != NULL
1609 && ecoff_ext.asym.index != indexNil)
1610 {
1611 unsigned indx;
1612 int bigendian;
1613 long sym_base;
1614 union aux_ext *aux_base;
1615
1616 indx = ecoff_ext.asym.index;
1617
1618 /* sym_base is used to map the fdr relative indices which
1619 appear in the file to the position number which we are
1620 using. */
1621 sym_base = ecoffsymbol (symbol)->fdr->isymBase;
1622 if (ecoffsymbol (symbol)->local)
1623 sym_base += ecoff_data (abfd)->symbolic_header.iextMax;
1624
1625 /* aux_base is the start of the aux entries for this file;
1626 asym.index is an offset from this. */
1627 aux_base = (ecoff_data (abfd)->external_aux
1628 + ecoffsymbol (symbol)->fdr->iauxBase);
1629
1630 /* The aux entries are stored in host byte order; the
1631 order is indicated by a bit in the fdr. */
1632 bigendian = ecoffsymbol (symbol)->fdr->fBigendian;
1633
1634 /* This switch is basically from gcc/mips-tdump.c */
1635 switch (ecoff_ext.asym.st)
1636 {
1637 case stNil:
1638 case stLabel:
1639 break;
1640
1641 case stFile:
1642 case stBlock:
1643 printf ("\n End+1 symbol: %ld", indx + sym_base);
1644 break;
1645
1646 case stEnd:
1647 if (ecoff_ext.asym.sc == scText
1648 || ecoff_ext.asym.sc == scInfo)
1649 printf ("\n First symbol: %ld", indx + sym_base);
1650 else
1651 printf ("\n First symbol: %ld",
1652 (long) (AUX_GET_ISYM (bigendian,
1653 &aux_base[ecoff_ext.asym.index])
1654 + sym_base));
1655 break;
1656
1657 case stProc:
1658 case stStaticProc:
1659 if (MIPS_IS_STAB (&ecoff_ext.asym))
1660 ;
1661 else if (ecoffsymbol (symbol)->local)
1662 printf ("\n End+1 symbol: %-7ld Type: %s",
1663 (long) (AUX_GET_ISYM (bigendian,
1664 &aux_base[ecoff_ext.asym.index])
1665 + sym_base),
1666 ecoff_type_to_string (abfd, aux_base, indx + 1,
1667 bigendian));
1668 else
1669 printf ("\n Local symbol: %d",
1670 (indx
1671 + sym_base
1672 + ecoff_data (abfd)->symbolic_header.iextMax));
1673 break;
1674
1675 default:
1676 if (!MIPS_IS_STAB (&ecoff_ext.asym))
1677 printf ("\n Type: %s",
1678 ecoff_type_to_string (abfd, aux_base, indx,
1679 bigendian));
1680 break;
1681 }
1682 }
1683 }
1684 break;
1685 }
1686 }
1687 \f
1688 /* Reloc handling. MIPS ECOFF relocs are packed into 8 bytes in
1689 external form. They use a bit which indicates whether the symbol
1690 is external. */
1691
1692 /* Swap a reloc in. */
1693
1694 static void
1695 ecoff_swap_reloc_in (abfd, ext, intern)
1696 bfd *abfd;
1697 RELOC *ext;
1698 struct internal_reloc *intern;
1699 {
1700 intern->r_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_vaddr);
1701 if (abfd->xvec->header_byteorder_big_p != false)
1702 {
1703 intern->r_symndx = (((int) ext->r_bits[0]
1704 << RELOC_BITS0_SYMNDX_SH_LEFT_BIG)
1705 | ((int) ext->r_bits[1]
1706 << RELOC_BITS1_SYMNDX_SH_LEFT_BIG)
1707 | ((int) ext->r_bits[2]
1708 << RELOC_BITS2_SYMNDX_SH_LEFT_BIG));
1709 intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_BIG)
1710 >> RELOC_BITS3_TYPE_SH_BIG);
1711 intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_BIG) != 0;
1712 }
1713 else
1714 {
1715 intern->r_symndx = (((int) ext->r_bits[0]
1716 << RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE)
1717 | ((int) ext->r_bits[1]
1718 << RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE)
1719 | ((int) ext->r_bits[2]
1720 << RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE));
1721 intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_LITTLE)
1722 >> RELOC_BITS3_TYPE_SH_LITTLE);
1723 intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_LITTLE) != 0;
1724 }
1725 }
1726
1727 /* Swap a reloc out. */
1728
1729 static unsigned int
1730 ecoff_swap_reloc_out (abfd, src, dst)
1731 bfd *abfd;
1732 PTR src;
1733 PTR dst;
1734 {
1735 struct internal_reloc *intern = (struct internal_reloc *) src;
1736 RELOC *ext = (RELOC *) dst;
1737
1738 bfd_h_put_32 (abfd, intern->r_vaddr, (bfd_byte *) ext->r_vaddr);
1739 if (abfd->xvec->header_byteorder_big_p != false)
1740 {
1741 ext->r_bits[0] = intern->r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_BIG;
1742 ext->r_bits[1] = intern->r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_BIG;
1743 ext->r_bits[2] = intern->r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_BIG;
1744 ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_BIG)
1745 & RELOC_BITS3_TYPE_BIG)
1746 | (intern->r_extern ? RELOC_BITS3_EXTERN_BIG : 0));
1747 }
1748 else
1749 {
1750 ext->r_bits[0] = intern->r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE;
1751 ext->r_bits[1] = intern->r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE;
1752 ext->r_bits[2] = intern->r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE;
1753 ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_LITTLE)
1754 & RELOC_BITS3_TYPE_LITTLE)
1755 | (intern->r_extern ? RELOC_BITS3_EXTERN_LITTLE : 0));
1756 }
1757
1758 return RELSZ;
1759 }
1760
1761 /* ECOFF relocs are either against external symbols, or against
1762 sections. If we are producing relocateable output, and the reloc
1763 is against an external symbol, and nothing has given us any
1764 additional addend, the resulting reloc will also be against the
1765 same symbol. In such a case, we don't want to change anything
1766 about the way the reloc is handled, since it will all be done at
1767 final link time. Rather than put special case code into
1768 bfd_perform_relocation, all the reloc types use this howto
1769 function. It just short circuits the reloc if producing
1770 relocateable output against an external symbol. */
1771
1772 static bfd_reloc_status_type
1773 ecoff_generic_reloc (abfd,
1774 reloc_entry,
1775 symbol,
1776 data,
1777 input_section,
1778 output_bfd)
1779 bfd *abfd;
1780 arelent *reloc_entry;
1781 asymbol *symbol;
1782 PTR data;
1783 asection *input_section;
1784 bfd *output_bfd;
1785 {
1786 if (output_bfd != (bfd *) NULL
1787 && (symbol->flags & BSF_SECTION_SYM) == 0
1788 && reloc_entry->addend == 0)
1789 {
1790 reloc_entry->address += input_section->output_offset;
1791 return bfd_reloc_ok;
1792 }
1793
1794 return bfd_reloc_continue;
1795 }
1796
1797 /* Do a REFHI relocation. This has to be done in combination with a
1798 REFLO reloc, because there is a carry from the REFLO to the REFHI.
1799 Here we just save the information we need; we do the actual
1800 relocation when we see the REFLO. ECOFF requires that the REFLO
1801 immediately follow the REFHI, so this ought to work. */
1802
1803 static bfd_byte *ecoff_refhi_addr;
1804 static bfd_vma ecoff_refhi_addend;
1805
1806 static bfd_reloc_status_type
1807 ecoff_refhi_reloc (abfd,
1808 reloc_entry,
1809 symbol,
1810 data,
1811 input_section,
1812 output_bfd)
1813 bfd *abfd;
1814 arelent *reloc_entry;
1815 asymbol *symbol;
1816 PTR data;
1817 asection *input_section;
1818 bfd *output_bfd;
1819 {
1820 bfd_reloc_status_type ret;
1821 bfd_vma relocation;
1822
1823 /* If we're relocating, and this an external symbol, we don't want
1824 to change anything. */
1825 if (output_bfd != (bfd *) NULL
1826 && (symbol->flags & BSF_SECTION_SYM) == 0
1827 && reloc_entry->addend == 0)
1828 {
1829 reloc_entry->address += input_section->output_offset;
1830 return bfd_reloc_ok;
1831 }
1832
1833 ret = bfd_reloc_ok;
1834 if (symbol->section == &bfd_und_section
1835 && output_bfd == (bfd *) NULL)
1836 ret = bfd_reloc_undefined;
1837
1838 if (bfd_is_com_section (symbol->section))
1839 relocation = 0;
1840 else
1841 relocation = symbol->value;
1842
1843 relocation += symbol->section->output_section->vma;
1844 relocation += symbol->section->output_offset;
1845 relocation += reloc_entry->addend;
1846
1847 if (reloc_entry->address > input_section->_cooked_size)
1848 return bfd_reloc_outofrange;
1849
1850 /* Save the information, and let REFLO do the actual relocation. */
1851 ecoff_refhi_addr = (bfd_byte *) data + reloc_entry->address;
1852 ecoff_refhi_addend = relocation;
1853
1854 if (output_bfd != (bfd *) NULL)
1855 reloc_entry->address += input_section->output_offset;
1856
1857 return ret;
1858 }
1859
1860 /* Do a REFLO relocation. This is a straightforward 16 bit inplace
1861 relocation; this function exists in order to do the REFHI
1862 relocation described above. */
1863
1864 static bfd_reloc_status_type
1865 ecoff_reflo_reloc (abfd,
1866 reloc_entry,
1867 symbol,
1868 data,
1869 input_section,
1870 output_bfd)
1871 bfd *abfd;
1872 arelent *reloc_entry;
1873 asymbol *symbol;
1874 PTR data;
1875 asection *input_section;
1876 bfd *output_bfd;
1877 {
1878 if (ecoff_refhi_addr != (bfd_byte *) NULL)
1879 {
1880 unsigned long insn;
1881 unsigned long val;
1882 unsigned long vallo;
1883
1884 /* Do the REFHI relocation. Note that we actually don't need to
1885 know anything about the REFLO itself, except where to find
1886 the low 16 bits of the addend needed by the REFHI. */
1887 insn = bfd_get_32 (abfd, ecoff_refhi_addr);
1888 vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
1889 & 0xffff);
1890 val = ((insn & 0xffff) << 16) + vallo;
1891 val += ecoff_refhi_addend;
1892
1893 /* The low order 16 bits are always treated as a signed value.
1894 Therefore, a negative value in the low order bits requires an
1895 adjustment in the high order bits. We need to make this
1896 adjustment in two ways: once for the bits we took from the
1897 data, and once for the bits we are putting back in to the
1898 data. */
1899 if ((vallo & 0x8000) != 0)
1900 val -= 0x10000;
1901 if ((val & 0x8000) != 0)
1902 val += 0x10000;
1903
1904 insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
1905 bfd_put_32 (abfd, insn, ecoff_refhi_addr);
1906
1907 ecoff_refhi_addr = (bfd_byte *) NULL;
1908 }
1909
1910 /* Now do the REFLO reloc in the usual way. */
1911 return ecoff_generic_reloc (abfd, reloc_entry, symbol, data,
1912 input_section, output_bfd);
1913 }
1914
1915 /* Do a GPREL relocation. This is a 16 bit value which must become
1916 the offset from the gp register. */
1917
1918 static bfd_reloc_status_type
1919 ecoff_gprel_reloc (abfd,
1920 reloc_entry,
1921 symbol,
1922 data,
1923 input_section,
1924 output_bfd)
1925 bfd *abfd;
1926 arelent *reloc_entry;
1927 asymbol *symbol;
1928 PTR data;
1929 asection *input_section;
1930 bfd *output_bfd;
1931 {
1932 boolean relocateable;
1933 bfd_vma relocation;
1934 unsigned long val;
1935 unsigned long insn;
1936
1937 /* If we're relocating, and this is an external symbol with no
1938 addend, we don't want to change anything. We will only have an
1939 addend if this is a newly created reloc, not read from an ECOFF
1940 file. */
1941 if (output_bfd != (bfd *) NULL
1942 && (symbol->flags & BSF_SECTION_SYM) == 0
1943 && reloc_entry->addend == 0)
1944 {
1945 reloc_entry->address += input_section->output_offset;
1946 return bfd_reloc_ok;
1947 }
1948
1949 if (output_bfd != (bfd *) NULL)
1950 relocateable = true;
1951 else
1952 {
1953 relocateable = false;
1954 output_bfd = symbol->section->output_section->owner;
1955 }
1956
1957 if (symbol->section == &bfd_und_section
1958 && relocateable == false)
1959 return bfd_reloc_undefined;
1960
1961 /* We have to figure out the gp value, so that we can adjust the
1962 symbol value correctly. We look up the symbol _gp in the output
1963 BFD. If we can't find it, we're stuck. We cache it in the ECOFF
1964 target data. We don't need to adjust the symbol value for an
1965 external symbol if we are producing relocateable output. */
1966 if (ecoff_data (output_bfd)->gp == 0
1967 && (relocateable == false
1968 || (symbol->flags & BSF_SECTION_SYM) != 0))
1969 {
1970 if (relocateable != false)
1971 {
1972 /* Make up a value. */
1973 ecoff_data (output_bfd)->gp =
1974 symbol->section->output_section->vma + 0x4000;
1975 }
1976 else
1977 {
1978 unsigned int count;
1979 asymbol **sym;
1980 unsigned int i;
1981
1982 count = bfd_get_symcount (output_bfd);
1983 sym = bfd_get_outsymbols (output_bfd);
1984
1985 /* We should do something more friendly here, but we don't
1986 have a good reloc status to return. */
1987 if (sym == (asymbol **) NULL)
1988 abort ();
1989
1990 for (i = 0; i < count; i++, sym++)
1991 {
1992 register CONST char *name;
1993
1994 name = bfd_asymbol_name (*sym);
1995 if (*name == '_' && strcmp (name, "_gp") == 0)
1996 {
1997 ecoff_data (output_bfd)->gp = bfd_asymbol_value (*sym);
1998 break;
1999 }
2000 }
2001
2002 /* We should do something more friendly here, but we don't have
2003 a good reloc status to return. */
2004 if (i >= count)
2005 abort ();
2006 }
2007 }
2008
2009 if (bfd_is_com_section (symbol->section))
2010 relocation = 0;
2011 else
2012 relocation = symbol->value;
2013
2014 relocation += symbol->section->output_section->vma;
2015 relocation += symbol->section->output_offset;
2016
2017 if (reloc_entry->address > input_section->_cooked_size)
2018 return bfd_reloc_outofrange;
2019
2020 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2021
2022 /* Set val to the offset into the section or symbol. */
2023 val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
2024 if (val & 0x8000)
2025 val -= 0x10000;
2026
2027 /* Adjust val for the final section location and GP value. If we
2028 are producing relocateable output, we don't want to do this for
2029 an external symbol. */
2030 if (relocateable == false
2031 || (symbol->flags & BSF_SECTION_SYM) != 0)
2032 val += relocation - ecoff_data (output_bfd)->gp;
2033
2034 insn = (insn &~ 0xffff) | (val & 0xffff);
2035 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
2036
2037 if (relocateable != false)
2038 reloc_entry->address += input_section->output_offset;
2039
2040 /* Make sure it fit in 16 bits. */
2041 if (val >= 0x8000 && val < 0xffff8000)
2042 return bfd_reloc_outofrange;
2043
2044 return bfd_reloc_ok;
2045 }
2046
2047 /* Read in the relocs for a section. */
2048
2049 static boolean
2050 ecoff_slurp_reloc_table (abfd, section, symbols)
2051 bfd *abfd;
2052 asection *section;
2053 asymbol **symbols;
2054 {
2055 RELOC *external_relocs;
2056 arelent *internal_relocs;
2057 arelent *rptr;
2058 unsigned int i;
2059
2060 if (section->relocation != (arelent *) NULL
2061 || section->reloc_count == 0
2062 || (section->flags & SEC_CONSTRUCTOR) != 0)
2063 return true;
2064
2065 if (ecoff_slurp_symbol_table (abfd) == false)
2066 return false;
2067
2068 internal_relocs = (arelent *) bfd_alloc (abfd,
2069 (sizeof (arelent)
2070 * section->reloc_count));
2071 external_relocs = (RELOC *) bfd_alloc (abfd, RELSZ * section->reloc_count);
2072 if (internal_relocs == (arelent *) NULL
2073 || external_relocs == (RELOC *) NULL)
2074 {
2075 bfd_error = no_memory;
2076 return false;
2077 }
2078 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
2079 return false;
2080 if (bfd_read (external_relocs, 1, RELSZ * section->reloc_count, abfd)
2081 != RELSZ * section->reloc_count)
2082 {
2083 bfd_error = system_call_error;
2084 return false;
2085 }
2086
2087 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
2088 {
2089 struct internal_reloc intern;
2090
2091 ecoff_swap_reloc_in (abfd, external_relocs + i, &intern);
2092
2093 if (intern.r_type > ECOFF_R_LITERAL)
2094 abort ();
2095
2096 if (intern.r_extern)
2097 {
2098 /* r_symndx is an index into the external symbols. */
2099 BFD_ASSERT (intern.r_symndx >= 0
2100 && (intern.r_symndx
2101 < ecoff_data (abfd)->symbolic_header.iextMax));
2102 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
2103 rptr->addend = 0;
2104 }
2105 else
2106 {
2107 CONST char *sec_name;
2108 asection *sec;
2109
2110 /* r_symndx is a section key. */
2111 switch (intern.r_symndx)
2112 {
2113 case RELOC_SECTION_TEXT: sec_name = ".text"; break;
2114 case RELOC_SECTION_RDATA: sec_name = ".rdata"; break;
2115 case RELOC_SECTION_DATA: sec_name = ".data"; break;
2116 case RELOC_SECTION_SDATA: sec_name = ".sdata"; break;
2117 case RELOC_SECTION_SBSS: sec_name = ".sbss"; break;
2118 case RELOC_SECTION_BSS: sec_name = ".bss"; break;
2119 case RELOC_SECTION_INIT: sec_name = ".init"; break;
2120 case RELOC_SECTION_LIT8: sec_name = ".lit8"; break;
2121 case RELOC_SECTION_LIT4: sec_name = ".lit4"; break;
2122 default: abort ();
2123 }
2124
2125 sec = bfd_get_section_by_name (abfd, sec_name);
2126 if (sec == (asection *) NULL)
2127 abort ();
2128 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
2129
2130 rptr->addend = - bfd_get_section_vma (abfd, sec);
2131 if (intern.r_type == ECOFF_R_GPREL
2132 || intern.r_type == ECOFF_R_LITERAL)
2133 rptr->addend += ecoff_data (abfd)->gp;
2134 }
2135
2136 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
2137 rptr->howto = &ecoff_howto_table[intern.r_type];
2138
2139 /* If the type is ECOFF_R_IGNORE, make sure this is a reference
2140 to the absolute section so that the reloc is ignored. */
2141 if (intern.r_type == ECOFF_R_IGNORE)
2142 rptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
2143 }
2144
2145 bfd_release (abfd, external_relocs);
2146
2147 section->relocation = internal_relocs;
2148
2149 return true;
2150 }
2151
2152 /* Get a canonical list of relocs. */
2153
2154 static unsigned int
2155 ecoff_canonicalize_reloc (abfd, section, relptr, symbols)
2156 bfd *abfd;
2157 asection *section;
2158 arelent **relptr;
2159 asymbol **symbols;
2160 {
2161 unsigned int count;
2162
2163 if (section->flags & SEC_CONSTRUCTOR)
2164 {
2165 arelent_chain *chain;
2166
2167 /* This section has relocs made up by us, not the file, so take
2168 them out of their chain and place them into the data area
2169 provided. */
2170 for (count = 0, chain = section->constructor_chain;
2171 count < section->reloc_count;
2172 count++, chain = chain->next)
2173 *relptr++ = &chain->relent;
2174 }
2175 else
2176 {
2177 arelent *tblptr;
2178
2179 if (ecoff_slurp_reloc_table (abfd, section, symbols) == false)
2180 return 0;
2181
2182 tblptr = section->relocation;
2183 if (tblptr == (arelent *) NULL)
2184 return 0;
2185
2186 for (count = 0; count < section->reloc_count; count++)
2187 *relptr++ = tblptr++;
2188 }
2189
2190 *relptr = (arelent *) NULL;
2191
2192 return section->reloc_count;
2193 }
2194
2195 /* Get the howto structure for a generic reloc type. */
2196
2197 static CONST struct reloc_howto_struct *
2198 ecoff_bfd_reloc_type_lookup (abfd, code)
2199 bfd *abfd;
2200 bfd_reloc_code_real_type code;
2201 {
2202 int ecoff_type;
2203
2204 switch (code)
2205 {
2206 case BFD_RELOC_16:
2207 ecoff_type = ECOFF_R_REFHALF;
2208 break;
2209 case BFD_RELOC_32:
2210 ecoff_type = ECOFF_R_REFWORD;
2211 break;
2212 case BFD_RELOC_MIPS_JMP:
2213 ecoff_type = ECOFF_R_JMPADDR;
2214 break;
2215 case BFD_RELOC_HI16_S:
2216 ecoff_type = ECOFF_R_REFHI;
2217 break;
2218 case BFD_RELOC_LO16:
2219 ecoff_type = ECOFF_R_REFLO;
2220 break;
2221 case BFD_RELOC_MIPS_GPREL:
2222 ecoff_type = ECOFF_R_GPREL;
2223 break;
2224 default:
2225 return (CONST struct reloc_howto_struct *) NULL;
2226 }
2227
2228 return &ecoff_howto_table[ecoff_type];
2229 }
2230 \f
2231 /* Provided a BFD, a section and an offset into the section, calculate
2232 and return the name of the source file and the line nearest to the
2233 wanted location. */
2234
2235 static boolean
2236 ecoff_find_nearest_line (abfd,
2237 section,
2238 ignore_symbols,
2239 offset,
2240 filename_ptr,
2241 functionname_ptr,
2242 retline_ptr)
2243 bfd *abfd;
2244 asection *section;
2245 asymbol **ignore_symbols;
2246 bfd_vma offset;
2247 CONST char **filename_ptr;
2248 CONST char **functionname_ptr;
2249 unsigned int *retline_ptr;
2250 {
2251 FDR *fdr_ptr;
2252 FDR *fdr_start;
2253 FDR *fdr_end;
2254 FDR *fdr_hold;
2255 struct pdr_ext *pdr_ptr;
2256 struct pdr_ext *pdr_end;
2257 PDR pdr;
2258 unsigned char *line_ptr;
2259 unsigned char *line_end;
2260 int lineno;
2261
2262 /* If we're not in the .text section, we don't have any line
2263 numbers. */
2264 if (strcmp (section->name, _TEXT) != 0
2265 || offset < ecoff_data (abfd)->text_start
2266 || offset >= ecoff_data (abfd)->text_end)
2267 return false;
2268
2269 /* Make sure we have the FDR's. */
2270 if (ecoff_slurp_symbolic_info (abfd) == false
2271 || bfd_get_symcount (abfd) == 0)
2272 return false;
2273
2274 /* Each file descriptor (FDR) has a memory address. Here we track
2275 down which FDR we want. The FDR's are stored in increasing
2276 memory order. If speed is ever important, this can become a
2277 binary search. We must ignore FDR's with no PDR entries; they
2278 will have the adr of the FDR before or after them. */
2279 fdr_start = ecoff_data (abfd)->fdr;
2280 fdr_end = fdr_start + ecoff_data (abfd)->symbolic_header.ifdMax;
2281 fdr_hold = (FDR *) NULL;
2282 for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
2283 {
2284 if (fdr_ptr->cpd == 0)
2285 continue;
2286 if (offset < fdr_ptr->adr)
2287 break;
2288 fdr_hold = fdr_ptr;
2289 }
2290 if (fdr_hold == (FDR *) NULL)
2291 return false;
2292 fdr_ptr = fdr_hold;
2293
2294 /* Each FDR has a list of procedure descriptors (PDR). PDR's also
2295 have an address, which is relative to the FDR address, and are
2296 also stored in increasing memory order. */
2297 offset -= fdr_ptr->adr;
2298 pdr_ptr = ecoff_data (abfd)->external_pdr + fdr_ptr->ipdFirst;
2299 pdr_end = pdr_ptr + fdr_ptr->cpd;
2300 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2301
2302 /* The address of the first PDR is an offset which applies to the
2303 addresses of all the PDR's. */
2304 offset += pdr.adr;
2305
2306 for (pdr_ptr++; pdr_ptr < pdr_end; pdr_ptr++)
2307 {
2308 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2309 if (offset < pdr.adr)
2310 break;
2311 }
2312
2313 /* Now we can look for the actual line number. The line numbers are
2314 stored in a very funky format, which I won't try to describe.
2315 Note that right here pdr_ptr and pdr hold the PDR *after* the one
2316 we want; we need this to compute line_end. */
2317 line_end = ecoff_data (abfd)->line;
2318 if (pdr_ptr == pdr_end)
2319 line_end += fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2320 else
2321 line_end += fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2322
2323 /* Now change pdr and pdr_ptr to the one we want. */
2324 pdr_ptr--;
2325 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2326
2327 offset -= pdr.adr;
2328 lineno = pdr.lnLow;
2329 line_ptr = (ecoff_data (abfd)->line
2330 + fdr_ptr->cbLineOffset
2331 + pdr.cbLineOffset);
2332 while (line_ptr < line_end)
2333 {
2334 int delta;
2335 int count;
2336
2337 delta = *line_ptr >> 4;
2338 if (delta >= 0x8)
2339 delta -= 0x10;
2340 count = (*line_ptr & 0xf) + 1;
2341 ++line_ptr;
2342 if (delta == -8)
2343 {
2344 delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2345 if (delta >= 0x8000)
2346 delta -= 0x10000;
2347 line_ptr += 2;
2348 }
2349 lineno += delta;
2350 if (offset < count * 4)
2351 break;
2352 offset -= count * 4;
2353 }
2354
2355 /* If fdr_ptr->rss is -1, then this file does not have full symbols,
2356 at least according to gdb/mipsread.c. */
2357 if (fdr_ptr->rss == -1)
2358 {
2359 *filename_ptr = NULL;
2360 if (pdr.isym == -1)
2361 *functionname_ptr = NULL;
2362 else
2363 {
2364 EXTR proc_ext;
2365
2366 ecoff_swap_ext_in (abfd,
2367 (ecoff_data (abfd)->external_ext
2368 + pdr.isym),
2369 &proc_ext);
2370 *functionname_ptr = ecoff_data (abfd)->ssext + proc_ext.asym.iss;
2371 }
2372 }
2373 else
2374 {
2375 SYMR proc_sym;
2376
2377 *filename_ptr = ecoff_data (abfd)->ss + fdr_ptr->issBase + fdr_ptr->rss;
2378 ecoff_swap_sym_in (abfd,
2379 (ecoff_data (abfd)->external_sym
2380 + fdr_ptr->isymBase
2381 + pdr.isym),
2382 &proc_sym);
2383 *functionname_ptr = (ecoff_data (abfd)->ss
2384 + fdr_ptr->issBase
2385 + proc_sym.iss);
2386 }
2387 *retline_ptr = lineno;
2388 return true;
2389 }
2390 \f
2391 /* We can't use the generic linking routines for ECOFF, because we
2392 have to handle all the debugging information. The generic link
2393 routine just works out the section contents and attaches a list of
2394 symbols.
2395
2396 We link by looping over all the seclets. We make two passes. On
2397 the first we set the actual section contents and determine the size
2398 of the debugging information. On the second we accumulate the
2399 debugging information and write it out.
2400
2401 This currently always accumulates the debugging information, which
2402 is incorrect, because it ignores the -s and -S options of the
2403 linker. The linker needs to be modified to give us that
2404 information in a more useful format (currently it just provides a
2405 list of symbols which should appear in the output file). */
2406
2407 /* Clear the output_has_begun flag for all the input BFD's. We use it
2408 to avoid linking in the debugging information for a BFD more than
2409 once. */
2410
2411 static void
2412 ecoff_clear_output_flags (abfd)
2413 bfd *abfd;
2414 {
2415 register asection *o;
2416 register bfd_seclet_type *p;
2417
2418 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2419 for (p = o->seclets_head;
2420 p != (bfd_seclet_type *) NULL;
2421 p = p->next)
2422 if (p->type == bfd_indirect_seclet)
2423 p->u.indirect.section->owner->output_has_begun = false;
2424 }
2425
2426 /* Handle an indirect seclet on the first pass. Set the contents of
2427 the output section, and accumulate the debugging information if
2428 any. */
2429
2430 static boolean
2431 ecoff_rel (output_bfd, seclet, output_section, data, relocateable)
2432 bfd *output_bfd;
2433 bfd_seclet_type *seclet;
2434 asection *output_section;
2435 PTR data;
2436 boolean relocateable;
2437 {
2438 bfd *input_bfd;
2439 HDRR *output_symhdr;
2440 HDRR *input_symhdr;
2441
2442 if ((output_section->flags & SEC_HAS_CONTENTS)
2443 && !(output_section->flags & SEC_NEVER_LOAD)
2444 && (output_section->flags & SEC_LOAD)
2445 && seclet->size)
2446 {
2447 data = (PTR) bfd_get_relocated_section_contents (output_bfd,
2448 seclet,
2449 data,
2450 relocateable);
2451 if (bfd_set_section_contents (output_bfd,
2452 output_section,
2453 data,
2454 seclet->offset,
2455 seclet->size)
2456 == false)
2457 {
2458 abort();
2459 }
2460 }
2461
2462 input_bfd = seclet->u.indirect.section->owner;
2463
2464 /* We want to figure out how much space will be required to
2465 incorporate all the debugging information from input_bfd. We use
2466 the output_has_begun field to avoid adding it in more than once.
2467 The actual incorporation is done in the second pass, in
2468 ecoff_get_debug. The code has to parallel that code in its
2469 manipulations of output_symhdr. */
2470
2471 if (input_bfd->output_has_begun)
2472 return true;
2473 input_bfd->output_has_begun = true;
2474
2475 output_symhdr = &ecoff_data (output_bfd)->symbolic_header;
2476
2477 if (input_bfd->xvec->flavour != bfd_target_ecoff_flavour)
2478 {
2479 asymbol **symbols;
2480 asymbol **sym_ptr;
2481 asymbol **sym_end;
2482
2483 /* We just accumulate local symbols from a non-ECOFF BFD. The
2484 external symbols are handled separately. */
2485
2486 symbols = (asymbol **) bfd_alloc (output_bfd,
2487 get_symtab_upper_bound (input_bfd));
2488 if (symbols == (asymbol **) NULL)
2489 {
2490 bfd_error = no_memory;
2491 return false;
2492 }
2493 sym_end = symbols + bfd_canonicalize_symtab (input_bfd, symbols);
2494
2495 for (sym_ptr = symbols; sym_ptr < sym_end; sym_ptr++)
2496 {
2497 size_t len;
2498
2499 len = strlen ((*sym_ptr)->name);
2500 if (((*sym_ptr)->flags & BSF_EXPORT) == 0)
2501 {
2502 ++output_symhdr->isymMax;
2503 output_symhdr->issMax += len + 1;
2504 }
2505 }
2506
2507 bfd_release (output_bfd, (PTR) symbols);
2508
2509 ++output_symhdr->ifdMax;
2510
2511 return true;
2512 }
2513
2514 /* We simply add in the information from another ECOFF BFD. First
2515 we make sure we have the symbolic information. */
2516 if (ecoff_slurp_symbol_table (input_bfd) == false)
2517 return false;
2518 if (bfd_get_symcount (input_bfd) == 0)
2519 return true;
2520
2521 input_symhdr = &ecoff_data (input_bfd)->symbolic_header;
2522
2523 /* Figure out how much information we are going to be putting in.
2524 The external symbols are handled separately. */
2525 output_symhdr->ilineMax += input_symhdr->ilineMax;
2526 output_symhdr->cbLine += input_symhdr->cbLine;
2527 output_symhdr->idnMax += input_symhdr->idnMax;
2528 output_symhdr->ipdMax += input_symhdr->ipdMax;
2529 output_symhdr->isymMax += input_symhdr->isymMax;
2530 output_symhdr->ioptMax += input_symhdr->ioptMax;
2531 output_symhdr->iauxMax += input_symhdr->iauxMax;
2532 output_symhdr->issMax += input_symhdr->issMax;
2533 output_symhdr->ifdMax += input_symhdr->ifdMax;
2534
2535 /* The RFD's are special, since we create them if needed. */
2536 if (input_symhdr->crfd > 0)
2537 output_symhdr->crfd += input_symhdr->crfd;
2538 else
2539 output_symhdr->crfd += input_symhdr->ifdMax;
2540
2541 return true;
2542 }
2543
2544 /* Handle an arbitrary seclet on the first pass. */
2545
2546 static boolean
2547 ecoff_dump_seclet (abfd, seclet, section, data, relocateable)
2548 bfd *abfd;
2549 bfd_seclet_type *seclet;
2550 asection *section;
2551 PTR data;
2552 boolean relocateable;
2553 {
2554 switch (seclet->type)
2555 {
2556 case bfd_indirect_seclet:
2557 /* The contents of this section come from another one somewhere
2558 else. */
2559 return ecoff_rel (abfd, seclet, section, data, relocateable);
2560
2561 case bfd_fill_seclet:
2562 /* Fill in the section with fill.value. This is used to pad out
2563 sections, but we must avoid padding the .bss section. */
2564 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2565 {
2566 if (seclet->u.fill.value != 0)
2567 abort ();
2568 }
2569 else
2570 {
2571 char *d = (char *) bfd_alloc (abfd, seclet->size);
2572 unsigned int i;
2573 boolean ret;
2574
2575 for (i = 0; i < seclet->size; i+=2)
2576 d[i] = seclet->u.fill.value >> 8;
2577 for (i = 1; i < seclet->size; i+=2)
2578 d[i] = seclet->u.fill.value;
2579 ret = bfd_set_section_contents (abfd, section, d, seclet->offset,
2580 seclet->size);
2581 bfd_release (abfd, (PTR) d);
2582 return ret;
2583 }
2584 break;
2585
2586 default:
2587 abort();
2588 }
2589
2590 return true;
2591 }
2592
2593 /* Add a string to the debugging information we are accumulating for a
2594 file. Return the offset from the fdr string base or from the
2595 external string base. */
2596
2597 static long
2598 ecoff_add_string (output_bfd, fdr, string, external)
2599 bfd *output_bfd;
2600 FDR *fdr;
2601 CONST char *string;
2602 boolean external;
2603 {
2604 HDRR *symhdr;
2605 size_t len;
2606 long ret;
2607
2608 symhdr = &ecoff_data (output_bfd)->symbolic_header;
2609 len = strlen (string);
2610 if (external)
2611 {
2612 strcpy (ecoff_data (output_bfd)->ssext + symhdr->issExtMax, string);
2613 ret = symhdr->issExtMax;
2614 symhdr->issExtMax += len + 1;
2615 }
2616 else
2617 {
2618 strcpy (ecoff_data (output_bfd)->ss + symhdr->issMax, string);
2619 ret = fdr->cbSs;
2620 symhdr->issMax += len + 1;
2621 fdr->cbSs += len + 1;
2622 }
2623 return ret;
2624 }
2625
2626 /* Accumulate the debugging information from an input section. */
2627
2628 static boolean
2629 ecoff_get_debug (output_bfd, seclet, section, relocateable)
2630 bfd *output_bfd;
2631 bfd_seclet_type *seclet;
2632 asection *section;
2633 boolean relocateable;
2634 {
2635 bfd *input_bfd;
2636 HDRR *output_symhdr;
2637 HDRR *input_symhdr;
2638 ecoff_data_type *output_ecoff;
2639 ecoff_data_type *input_ecoff;
2640 unsigned int count;
2641 struct sym_ext *sym_out;
2642 ecoff_symbol_type *esym_ptr;
2643 ecoff_symbol_type *esym_end;
2644 FDR *fdr_ptr;
2645 FDR *fdr_end;
2646 struct fdr_ext *fdr_out;
2647
2648 input_bfd = seclet->u.indirect.section->owner;
2649
2650 /* Don't get the information more than once. */
2651 if (input_bfd->output_has_begun)
2652 return true;
2653 input_bfd->output_has_begun = true;
2654
2655 output_ecoff = ecoff_data (output_bfd);
2656 output_symhdr = &output_ecoff->symbolic_header;
2657
2658 if (input_bfd->xvec->flavour != bfd_target_ecoff_flavour)
2659 {
2660 FDR fdr;
2661 asymbol **symbols;
2662 asymbol **sym_ptr;
2663 asymbol **sym_end;
2664
2665 /* This is not an ECOFF BFD. Just gather the symbols. */
2666
2667 memset (&fdr, 0, sizeof fdr);
2668
2669 fdr.adr = bfd_get_section_vma (output_bfd, section) + seclet->offset;
2670 fdr.issBase = output_symhdr->issMax;
2671 fdr.cbSs = 0;
2672 fdr.rss = ecoff_add_string (output_bfd,
2673 &fdr,
2674 bfd_get_filename (input_bfd),
2675 false);
2676 fdr.isymBase = output_symhdr->isymMax;
2677
2678 /* Get the local symbols from the input BFD. */
2679 symbols = (asymbol **) bfd_alloc (output_bfd,
2680 get_symtab_upper_bound (input_bfd));
2681 if (symbols == (asymbol **) NULL)
2682 {
2683 bfd_error = no_memory;
2684 return false;
2685 }
2686 sym_end = symbols + bfd_canonicalize_symtab (input_bfd, symbols);
2687
2688 /* Handle the local symbols. Any external symbols are handled
2689 separately. */
2690 fdr.csym = 0;
2691 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
2692 {
2693 SYMR internal_sym;
2694
2695 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
2696 continue;
2697 memset (&internal_sym, 0, sizeof internal_sym);
2698 internal_sym.iss = ecoff_add_string (output_bfd,
2699 &fdr,
2700 (*sym_ptr)->name,
2701 false);
2702
2703 if (bfd_is_com_section ((*sym_ptr)->section)
2704 || (*sym_ptr)->section == &bfd_und_section)
2705 internal_sym.value = (*sym_ptr)->value;
2706 else
2707 internal_sym.value = ((*sym_ptr)->value
2708 + (*sym_ptr)->section->output_offset
2709 + (*sym_ptr)->section->output_section->vma);
2710 internal_sym.st = stNil;
2711 internal_sym.sc = scUndefined;
2712 internal_sym.index = indexNil;
2713 ecoff_swap_sym_out (output_bfd, &internal_sym,
2714 (output_ecoff->external_sym
2715 + output_symhdr->isymMax));
2716 ++fdr.csym;
2717 ++output_symhdr->isymMax;
2718 }
2719
2720 bfd_release (output_bfd, (PTR) symbols);
2721
2722 /* Leave everything else in the FDR zeroed out. This will cause
2723 the lang field to be langC. The fBigendian field will
2724 indicate little endian format, but it doesn't matter because
2725 it only applies to aux fields and there are none. */
2726
2727 ecoff_swap_fdr_out (output_bfd, &fdr,
2728 (output_ecoff->external_fdr
2729 + output_symhdr->ifdMax));
2730 ++output_symhdr->ifdMax;
2731 return true;
2732 }
2733
2734 /* This is an ECOFF BFD. We want to grab the information from
2735 input_bfd and attach it to output_bfd. */
2736 count = bfd_get_symcount (input_bfd);
2737 if (count == 0)
2738 return true;
2739 input_ecoff = ecoff_data (input_bfd);
2740 input_symhdr = &input_ecoff->symbolic_header;
2741
2742 /* I think that it is more efficient to simply copy the debugging
2743 information from the input BFD to the output BFD. Because ECOFF
2744 uses relative pointers for most of the debugging information,
2745 only a little of it has to be changed at all. */
2746
2747 /* Swap in the local symbols, adjust their values, and swap them out
2748 again. The external symbols are handled separately. */
2749 sym_out = output_ecoff->external_sym + output_symhdr->isymMax;
2750
2751 esym_ptr = ecoff_data (input_bfd)->canonical_symbols;
2752 esym_end = esym_ptr + count;
2753 for (; esym_ptr < esym_end; esym_ptr++)
2754 {
2755 if (esym_ptr->local)
2756 {
2757 SYMR sym;
2758
2759 ecoff_swap_sym_in (input_bfd, esym_ptr->native.lnative, &sym);
2760
2761 /* If we're producing an executable, move common symbols
2762 into bss. */
2763 if (relocateable == false)
2764 {
2765 if (sym.sc == scCommon)
2766 sym.sc = scBss;
2767 else if (sym.sc == scSCommon)
2768 sym.sc = scSBss;
2769 }
2770
2771 if (! bfd_is_com_section (esym_ptr->symbol.section)
2772 && (esym_ptr->symbol.flags & BSF_DEBUGGING) == 0
2773 && esym_ptr->symbol.section != &bfd_und_section)
2774 sym.value = (esym_ptr->symbol.value
2775 + esym_ptr->symbol.section->output_offset
2776 + esym_ptr->symbol.section->output_section->vma);
2777 ecoff_swap_sym_out (output_bfd, &sym, sym_out);
2778 ++sym_out;
2779 }
2780 }
2781
2782 /* That should have accounted for all the local symbols in
2783 input_bfd. */
2784 BFD_ASSERT ((sym_out - output_ecoff->external_sym) - output_symhdr->isymMax
2785 == input_symhdr->isymMax);
2786
2787 /* Copy the information that does not need swapping. */
2788 memcpy (output_ecoff->line + output_symhdr->cbLine,
2789 input_ecoff->line,
2790 input_symhdr->cbLine * sizeof (unsigned char));
2791 memcpy (output_ecoff->external_aux + output_symhdr->iauxMax,
2792 input_ecoff->external_aux,
2793 input_symhdr->iauxMax * sizeof (union aux_ext));
2794 memcpy (output_ecoff->ss + output_symhdr->issMax,
2795 input_ecoff->ss,
2796 input_symhdr->issMax * sizeof (char));
2797
2798 /* Some of the information may need to be swapped. */
2799 if (output_bfd->xvec->header_byteorder_big_p
2800 == input_bfd->xvec->header_byteorder_big_p)
2801 {
2802 /* The two BFD's have the same endianness, so memcpy will
2803 suffice. */
2804 memcpy (output_ecoff->external_dnr + output_symhdr->idnMax,
2805 input_ecoff->external_dnr,
2806 input_symhdr->idnMax * sizeof (struct dnr_ext));
2807 memcpy (output_ecoff->external_pdr + output_symhdr->ipdMax,
2808 input_ecoff->external_pdr,
2809 input_symhdr->ipdMax * sizeof (struct pdr_ext));
2810 memcpy (output_ecoff->external_opt + output_symhdr->ioptMax,
2811 input_ecoff->external_opt,
2812 input_symhdr->ioptMax * sizeof (struct opt_ext));
2813 }
2814 else
2815 {
2816 struct dnr_ext *dnr_in;
2817 struct dnr_ext *dnr_end;
2818 struct dnr_ext *dnr_out;
2819 struct pdr_ext *pdr_in;
2820 struct pdr_ext *pdr_end;
2821 struct pdr_ext *pdr_out;
2822 struct opt_ext *opt_in;
2823 struct opt_ext *opt_end;
2824 struct opt_ext *opt_out;
2825
2826 /* The two BFD's have different endianness, so we must swap
2827 everything in and out. This code would always work, but it
2828 would be slow in the normal case. */
2829 dnr_in = input_ecoff->external_dnr;
2830 dnr_end = dnr_in + input_symhdr->idnMax;
2831 dnr_out = output_ecoff->external_dnr + output_symhdr->idnMax;
2832 for (; dnr_in < dnr_end; dnr_in++, dnr_out++)
2833 {
2834 DNR dnr;
2835
2836 ecoff_swap_dnr_in (input_bfd, dnr_in, &dnr);
2837 ecoff_swap_dnr_out (output_bfd, &dnr, dnr_out);
2838 }
2839 pdr_in = input_ecoff->external_pdr;
2840 pdr_end = pdr_in + input_symhdr->ipdMax;
2841 pdr_out = output_ecoff->external_pdr + output_symhdr->ipdMax;
2842 for (; pdr_in < pdr_end; pdr_in++, pdr_out++)
2843 {
2844 PDR pdr;
2845
2846 ecoff_swap_pdr_in (input_bfd, pdr_in, &pdr);
2847 ecoff_swap_pdr_out (output_bfd, &pdr, pdr_out);
2848 }
2849 opt_in = input_ecoff->external_opt;
2850 opt_end = opt_in + input_symhdr->ioptMax;
2851 opt_out = output_ecoff->external_opt + output_symhdr->ioptMax;
2852 for (; opt_in < opt_end; opt_in++, opt_out++)
2853 {
2854 OPTR opt;
2855
2856 ecoff_swap_opt_in (input_bfd, opt_in, &opt);
2857 ecoff_swap_opt_out (output_bfd, &opt, opt_out);
2858 }
2859 }
2860
2861 /* Set ifdbase so that the external symbols know how to adjust their
2862 ifd values. */
2863 input_ecoff->ifdbase = output_symhdr->ifdMax;
2864
2865 fdr_ptr = input_ecoff->fdr;
2866 fdr_end = fdr_ptr + input_symhdr->ifdMax;
2867 fdr_out = output_ecoff->external_fdr + output_symhdr->ifdMax;
2868 for (; fdr_ptr < fdr_end; fdr_ptr++, fdr_out++)
2869 {
2870 FDR fdr;
2871 unsigned long pdr_off;
2872
2873 fdr = *fdr_ptr;
2874
2875 /* The memory address for this fdr is the address for the seclet
2876 plus the offset to this fdr within input_bfd. For some
2877 reason the offset of the first procedure pointer is also
2878 added in. */
2879 if (fdr.cpd == 0)
2880 pdr_off = 0;
2881 else
2882 {
2883 PDR pdr;
2884
2885 ecoff_swap_pdr_in (input_bfd,
2886 input_ecoff->external_pdr + fdr.ipdFirst,
2887 &pdr);
2888 pdr_off = pdr.adr;
2889 }
2890 fdr.adr = (bfd_get_section_vma (output_bfd, section)
2891 + seclet->offset
2892 + (fdr_ptr->adr - input_ecoff->fdr->adr)
2893 + pdr_off);
2894
2895 fdr.issBase += output_symhdr->issMax;
2896 fdr.isymBase += output_symhdr->isymMax;
2897 fdr.ilineBase += output_symhdr->ilineMax;
2898 fdr.ioptBase += output_symhdr->ioptMax;
2899 fdr.ipdFirst += output_symhdr->ipdMax;
2900 fdr.iauxBase += output_symhdr->iauxMax;
2901 fdr.rfdBase += output_symhdr->crfd;
2902
2903 /* If there are no RFD's, we are going to add some. We don't
2904 want to adjust irfd for this, so that all the FDR's can share
2905 the RFD's. */
2906 if (input_symhdr->crfd == 0)
2907 fdr.crfd = input_symhdr->ifdMax;
2908
2909 if (fdr.cbLine != 0)
2910 fdr.cbLineOffset += output_symhdr->cbLine;
2911
2912 ecoff_swap_fdr_out (output_bfd, &fdr, fdr_out);
2913 }
2914
2915 if (input_symhdr->crfd > 0)
2916 {
2917 struct rfd_ext *rfd_in;
2918 struct rfd_ext *rfd_end;
2919 struct rfd_ext *rfd_out;
2920
2921 /* Swap and adjust the RFD's. RFD's are only created by the
2922 linker, so this will only be necessary if one of the input
2923 files is the result of a partial link. Presumably all
2924 necessary RFD's are present. */
2925 rfd_in = input_ecoff->external_rfd;
2926 rfd_end = rfd_in + input_symhdr->crfd;
2927 rfd_out = output_ecoff->external_rfd + output_symhdr->crfd;
2928 for (; rfd_in < rfd_end; rfd_in++, rfd_out++)
2929 {
2930 RFDT rfd;
2931
2932 ecoff_swap_rfd_in (input_bfd, rfd_in, &rfd);
2933 rfd += output_symhdr->ifdMax;
2934 ecoff_swap_rfd_out (output_bfd, &rfd, rfd_out);
2935 }
2936 output_symhdr->crfd += input_symhdr->crfd;
2937 }
2938 else
2939 {
2940 struct rfd_ext *rfd_out;
2941 struct rfd_ext *rfd_end;
2942 RFDT rfd;
2943
2944 /* Create RFD's. Some of the debugging information includes
2945 relative file indices. These indices are taken as indices to
2946 the RFD table if there is one, or to the global table if
2947 there is not. If we did not create RFD's, we would have to
2948 parse and adjust all the debugging information which contains
2949 file indices. */
2950 rfd = output_symhdr->ifdMax;
2951 rfd_out = output_ecoff->external_rfd + output_symhdr->crfd;
2952 rfd_end = rfd_out + input_symhdr->ifdMax;
2953 for (; rfd_out < rfd_end; rfd_out++, rfd++)
2954 ecoff_swap_rfd_out (output_bfd, &rfd, rfd_out);
2955 output_symhdr->crfd += input_symhdr->ifdMax;
2956 }
2957
2958 /* Combine the register masks. */
2959 {
2960 int i;
2961
2962 output_ecoff->gprmask |= input_ecoff->gprmask;
2963 for (i = 0; i < 4; i++)
2964 output_ecoff->cprmask[i] |= input_ecoff->cprmask[i];
2965 }
2966
2967 /* Update the counts. */
2968 output_symhdr->ilineMax += input_symhdr->ilineMax;
2969 output_symhdr->cbLine += input_symhdr->cbLine;
2970 output_symhdr->idnMax += input_symhdr->idnMax;
2971 output_symhdr->ipdMax += input_symhdr->ipdMax;
2972 output_symhdr->isymMax += input_symhdr->isymMax;
2973 output_symhdr->ioptMax += input_symhdr->ioptMax;
2974 output_symhdr->iauxMax += input_symhdr->iauxMax;
2975 output_symhdr->issMax += input_symhdr->issMax;
2976 output_symhdr->ifdMax += input_symhdr->ifdMax;
2977
2978 return true;
2979 }
2980
2981 /* This is the actual link routine. It makes two passes over all the
2982 seclets. */
2983
2984 static boolean
2985 ecoff_bfd_seclet_link (abfd, data, relocateable)
2986 bfd *abfd;
2987 PTR data;
2988 boolean relocateable;
2989 {
2990 HDRR *symhdr;
2991 int ipass;
2992 register asection *o;
2993 register bfd_seclet_type *p;
2994 asymbol **sym_ptr_ptr;
2995 bfd_size_type size;
2996 char *raw;
2997
2998 /* We accumulate the debugging information counts in the symbolic
2999 header. */
3000 symhdr = &ecoff_data (abfd)->symbolic_header;
3001 symhdr->magic = magicSym;
3002 /* FIXME: What should the version stamp be? */
3003 symhdr->vstamp = 0;
3004 symhdr->ilineMax = 0;
3005 symhdr->cbLine = 0;
3006 symhdr->idnMax = 0;
3007 symhdr->ipdMax = 0;
3008 symhdr->isymMax = 0;
3009 symhdr->ioptMax = 0;
3010 symhdr->iauxMax = 0;
3011 symhdr->issMax = 0;
3012 symhdr->issExtMax = 0;
3013 symhdr->ifdMax = 0;
3014 symhdr->crfd = 0;
3015 symhdr->iextMax = 0;
3016
3017 /* We need to copy over the debugging symbols from each input BFD.
3018 When we do this copying, we have to adjust the text address in
3019 the FDR structures, so we have to know the text address used for
3020 the input BFD. Since we only want to copy the symbols once per
3021 input BFD, but we are going to look at each input BFD multiple
3022 times (once for each section it provides), we arrange to always
3023 look at the text section first. That means that when we copy the
3024 debugging information, we always know the text address. So we
3025 actually do each pass in two sub passes; first the text sections,
3026 then the non-text sections. We use the output_has_begun flag to
3027 determine whether we have copied over the debugging information
3028 yet. */
3029
3030 /* Do the first pass: set the output section contents and count the
3031 debugging information. */
3032 ecoff_clear_output_flags (abfd);
3033 for (ipass = 0; ipass < 2; ipass++)
3034 {
3035 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3036 {
3037 /* For SEC_CODE sections, (flags & SEC_CODE) == 0 is false,
3038 so they are done on pass 0. For other sections the
3039 expression is true, so they are done on pass 1. */
3040 if (((o->flags & SEC_CODE) == 0) != ipass)
3041 continue;
3042
3043 for (p = o->seclets_head;
3044 p != (bfd_seclet_type *) NULL;
3045 p = p->next)
3046 {
3047 if (ecoff_dump_seclet (abfd, p, o, data, relocateable)
3048 == false)
3049 return false;
3050 }
3051 }
3052 }
3053
3054 /* We handle the external symbols differently. We use the ones
3055 attached to the output_bfd. The linker will have already
3056 determined which symbols are to be attached. Here we just
3057 determine how much space we will need for them. */
3058 sym_ptr_ptr = bfd_get_outsymbols (abfd);
3059 if (sym_ptr_ptr != NULL)
3060 {
3061 asymbol **sym_end;
3062
3063 sym_end = sym_ptr_ptr + bfd_get_symcount (abfd);
3064 for (; sym_ptr_ptr < sym_end; sym_ptr_ptr++)
3065 {
3066 if (((*sym_ptr_ptr)->flags & BSF_DEBUGGING) == 0
3067 && ((*sym_ptr_ptr)->flags & BSF_LOCAL) == 0)
3068 {
3069 ++symhdr->iextMax;
3070 symhdr->issExtMax += strlen ((*sym_ptr_ptr)->name) + 1;
3071 }
3072 }
3073 }
3074
3075 /* Adjust the counts so that structures are longword aligned. */
3076 symhdr->cbLine = (symhdr->cbLine + 3) &~ 3;
3077 symhdr->issMax = (symhdr->issMax + 3) &~ 3;
3078 symhdr->issExtMax = (symhdr->issExtMax + 3) &~ 3;
3079
3080 /* Now the counts in symhdr are the correct size for the debugging
3081 information. We allocate the right amount of space, and reset
3082 the counts so that the second pass can use them as indices. It
3083 would be possible to output the debugging information directly to
3084 the file in pass 2, rather than to build it in memory and then
3085 write it out. Outputting to the file would require a lot of
3086 seeks and small writes, though, and I think this approach is
3087 faster. */
3088 size = (symhdr->cbLine * sizeof (unsigned char)
3089 + symhdr->idnMax * sizeof (struct dnr_ext)
3090 + symhdr->ipdMax * sizeof (struct pdr_ext)
3091 + symhdr->isymMax * sizeof (struct sym_ext)
3092 + symhdr->ioptMax * sizeof (struct opt_ext)
3093 + symhdr->iauxMax * sizeof (union aux_ext)
3094 + symhdr->issMax * sizeof (char)
3095 + symhdr->issExtMax * sizeof (char)
3096 + symhdr->ifdMax * sizeof (struct fdr_ext)
3097 + symhdr->crfd * sizeof (struct rfd_ext)
3098 + symhdr->iextMax * sizeof (struct ext_ext));
3099 raw = (char *) bfd_alloc (abfd, size);
3100 if (raw == (char *) NULL)
3101 {
3102 bfd_error = no_memory;
3103 return false;
3104 }
3105 ecoff_data (abfd)->raw_size = size;
3106 ecoff_data (abfd)->raw_syments = (PTR) raw;
3107
3108 /* Initialize the raw pointers. */
3109 #define SET(field, count, type) \
3110 ecoff_data (abfd)->field = (type *) raw; \
3111 raw += symhdr->count * sizeof (type)
3112
3113 SET (line, cbLine, unsigned char);
3114 SET (external_dnr, idnMax, struct dnr_ext);
3115 SET (external_pdr, ipdMax, struct pdr_ext);
3116 SET (external_sym, isymMax, struct sym_ext);
3117 SET (external_opt, ioptMax, struct opt_ext);
3118 SET (external_aux, iauxMax, union aux_ext);
3119 SET (ss, issMax, char);
3120 SET (ssext, issExtMax, char);
3121 SET (external_fdr, ifdMax, struct fdr_ext);
3122 SET (external_rfd, crfd, struct rfd_ext);
3123 SET (external_ext, iextMax, struct ext_ext);
3124 #undef SET
3125
3126 /* Reset the counts so the second pass can use them to know how far
3127 it has gotten. */
3128 symhdr->ilineMax = 0;
3129 symhdr->cbLine = 0;
3130 symhdr->idnMax = 0;
3131 symhdr->ipdMax = 0;
3132 symhdr->isymMax = 0;
3133 symhdr->ioptMax = 0;
3134 symhdr->iauxMax = 0;
3135 symhdr->issMax = 0;
3136 symhdr->issExtMax = 0;
3137 symhdr->ifdMax = 0;
3138 symhdr->crfd = 0;
3139 symhdr->iextMax = 0;
3140
3141 /* Do the second pass: accumulate the debugging information. */
3142 ecoff_clear_output_flags (abfd);
3143 for (ipass = 0; ipass < 2; ipass++)
3144 {
3145 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3146 {
3147 if (((o->flags & SEC_CODE) == 0) != ipass)
3148 continue;
3149 for (p = o->seclets_head;
3150 p != (bfd_seclet_type *) NULL;
3151 p = p->next)
3152 {
3153 if (p->type == bfd_indirect_seclet)
3154 {
3155 if (ecoff_get_debug (abfd, p, o, relocateable) == false)
3156 return false;
3157 }
3158 }
3159 }
3160 }
3161
3162 /* Put in the external symbols. */
3163 sym_ptr_ptr = bfd_get_outsymbols (abfd);
3164 if (sym_ptr_ptr != NULL)
3165 {
3166 char *ssext;
3167 struct ext_ext *external_ext;
3168
3169 ssext = ecoff_data (abfd)->ssext;
3170 external_ext = ecoff_data (abfd)->external_ext;
3171 for (; *sym_ptr_ptr != NULL; sym_ptr_ptr++)
3172 {
3173 asymbol *sym_ptr;
3174 EXTR esym;
3175
3176 sym_ptr = *sym_ptr_ptr;
3177
3178 if ((sym_ptr->flags & BSF_DEBUGGING) != 0
3179 || (sym_ptr->flags & BSF_LOCAL) != 0)
3180 continue;
3181
3182 /* The enative pointer can be NULL for a symbol created by
3183 the linker via ecoff_make_empty_symbol. */
3184 if (bfd_asymbol_flavour (sym_ptr) != bfd_target_ecoff_flavour
3185 || (((ecoff_symbol_type *) sym_ptr)->native.enative
3186 == (struct ext_ext *) NULL))
3187 {
3188 esym.jmptbl = 0;
3189 esym.cobol_main = 0;
3190 esym.weakext = 0;
3191 esym.reserved = 0;
3192 esym.ifd = ifdNil;
3193 /* FIXME: we can do better than this for st and sc. */
3194 esym.asym.st = stGlobal;
3195 esym.asym.sc = scAbs;
3196 esym.asym.reserved = 0;
3197 esym.asym.index = indexNil;
3198 }
3199 else
3200 {
3201 ecoff_symbol_type *ecoff_sym_ptr;
3202
3203 ecoff_sym_ptr = (ecoff_symbol_type *) sym_ptr;
3204 if (ecoff_sym_ptr->local)
3205 abort ();
3206 ecoff_swap_ext_in (abfd, ecoff_sym_ptr->native.enative, &esym);
3207
3208 /* If we're producing an executable, move common symbols
3209 into bss. */
3210 if (relocateable == false)
3211 {
3212 if (esym.asym.sc == scCommon)
3213 esym.asym.sc = scBss;
3214 else if (esym.asym.sc == scSCommon)
3215 esym.asym.sc = scSBss;
3216 }
3217
3218 /* Adjust the FDR index for the symbol by that used for
3219 the input BFD. */
3220 esym.ifd += ecoff_data (bfd_asymbol_bfd (sym_ptr))->ifdbase;
3221 }
3222
3223 esym.asym.iss = symhdr->issExtMax;
3224
3225 if (bfd_is_com_section (sym_ptr->section)
3226 || sym_ptr->section == &bfd_und_section)
3227 esym.asym.value = sym_ptr->value;
3228 else
3229 esym.asym.value = (sym_ptr->value
3230 + sym_ptr->section->output_offset
3231 + sym_ptr->section->output_section->vma);
3232
3233 ecoff_swap_ext_out (abfd, &esym, external_ext + symhdr->iextMax);
3234
3235 ecoff_set_sym_index (sym_ptr, symhdr->iextMax);
3236
3237 ++symhdr->iextMax;
3238
3239 strcpy (ssext + symhdr->issExtMax, sym_ptr->name);
3240 symhdr->issExtMax += strlen (sym_ptr->name) + 1;
3241 }
3242 }
3243
3244 /* Adjust the counts so that structures are longword aligned. */
3245 symhdr->cbLine = (symhdr->cbLine + 3) &~ 3;
3246 symhdr->issMax = (symhdr->issMax + 3) &~ 3;
3247 symhdr->issExtMax = (symhdr->issExtMax + 3) &~ 3;
3248
3249 return true;
3250 }
3251 \f
3252 /* Set the architecture. The only architecture we support here is
3253 mips. We set the architecture anyhow, since many callers ignore
3254 the return value. */
3255
3256 static boolean
3257 ecoff_set_arch_mach (abfd, arch, machine)
3258 bfd *abfd;
3259 enum bfd_architecture arch;
3260 unsigned long machine;
3261 {
3262 bfd_default_set_arch_mach (abfd, arch, machine);
3263 return arch == bfd_arch_mips;
3264 }
3265
3266 /* Get the size of the section headers. We do not output the .scommon
3267 section which we created in ecoff_mkobject. */
3268
3269 static int
3270 ecoff_sizeof_headers (abfd, reloc)
3271 bfd *abfd;
3272 boolean reloc;
3273 {
3274 return FILHSZ + AOUTSZ + (abfd->section_count - 1) * SCNHSZ;
3275 }
3276
3277 /* Calculate the file position for each section, and set
3278 reloc_filepos. */
3279
3280 static void
3281 ecoff_compute_section_file_positions (abfd)
3282 bfd *abfd;
3283 {
3284 asection *current;
3285 file_ptr sofar;
3286 file_ptr old_sofar;
3287 boolean first_data;
3288
3289 if (bfd_get_start_address (abfd))
3290 abfd->flags |= EXEC_P;
3291
3292 sofar = ecoff_sizeof_headers (abfd, false);
3293
3294 first_data = true;
3295 for (current = abfd->sections;
3296 current != (asection *) NULL;
3297 current = current->next)
3298 {
3299 /* Only deal with sections which have contents */
3300 if (! (current->flags & SEC_HAS_CONTENTS)
3301 || strcmp (current->name, SCOMMON) == 0)
3302 continue;
3303
3304 /* On Ultrix, the data sections in an executable file must be
3305 aligned to a page boundary within the file. This does not
3306 affect the section size, though. FIXME: Does this work for
3307 other platforms? */
3308 if ((abfd->flags & EXEC_P) != 0
3309 && (abfd->flags & D_PAGED) != 0
3310 && first_data != false
3311 && (current->flags & SEC_CODE) == 0)
3312 {
3313 sofar = (sofar + ROUND_SIZE - 1) &~ (ROUND_SIZE - 1);
3314 first_data = false;
3315 }
3316
3317 /* Align the sections in the file to the same boundary on
3318 which they are aligned in virtual memory. */
3319 old_sofar = sofar;
3320 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3321
3322 current->filepos = sofar;
3323
3324 sofar += current->_raw_size;
3325
3326 /* make sure that this section is of the right size too */
3327 old_sofar = sofar;
3328 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3329 current->_raw_size += sofar - old_sofar;
3330 }
3331
3332 ecoff_data (abfd)->reloc_filepos = sofar;
3333 }
3334
3335 /* Set the contents of a section. */
3336
3337 static boolean
3338 ecoff_set_section_contents (abfd, section, location, offset, count)
3339 bfd *abfd;
3340 asection *section;
3341 PTR location;
3342 file_ptr offset;
3343 bfd_size_type count;
3344 {
3345 if (abfd->output_has_begun == false)
3346 ecoff_compute_section_file_positions (abfd);
3347
3348 bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
3349
3350 if (count != 0)
3351 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3352
3353 return true;
3354 }
3355
3356 /* Write out an ECOFF file. */
3357
3358 static boolean
3359 ecoff_write_object_contents (abfd)
3360 bfd *abfd;
3361 {
3362 asection *current;
3363 unsigned int count;
3364 file_ptr scn_base;
3365 file_ptr reloc_base;
3366 file_ptr sym_base;
3367 unsigned long reloc_size;
3368 unsigned long text_size;
3369 unsigned long text_start;
3370 unsigned long data_size;
3371 unsigned long data_start;
3372 unsigned long bss_size;
3373 struct internal_filehdr internal_f;
3374 struct internal_aouthdr internal_a;
3375 int i;
3376
3377 bfd_error = system_call_error;
3378
3379 if(abfd->output_has_begun == false)
3380 ecoff_compute_section_file_positions(abfd);
3381
3382 if (abfd->sections != (asection *) NULL)
3383 scn_base = abfd->sections->filepos;
3384 else
3385 scn_base = 0;
3386 reloc_base = ecoff_data (abfd)->reloc_filepos;
3387
3388 count = 1;
3389 reloc_size = 0;
3390 for (current = abfd->sections;
3391 current != (asection *)NULL;
3392 current = current->next)
3393 {
3394 if (strcmp (current->name, SCOMMON) == 0)
3395 continue;
3396 current->target_index = count;
3397 ++count;
3398 if (current->reloc_count != 0)
3399 {
3400 bfd_size_type relsize;
3401
3402 current->rel_filepos = reloc_base;
3403 relsize = current->reloc_count * RELSZ;
3404 reloc_size += relsize;
3405 reloc_base += relsize;
3406 }
3407 else
3408 current->rel_filepos = 0;
3409 }
3410
3411 sym_base = reloc_base + reloc_size;
3412
3413 /* At least on Ultrix, the symbol table of an executable file must
3414 be aligned to a page boundary. FIXME: Is this true on other
3415 platforms? */
3416 if ((abfd->flags & EXEC_P) != 0
3417 && (abfd->flags & D_PAGED) != 0)
3418 sym_base = (sym_base + ROUND_SIZE - 1) &~ (ROUND_SIZE - 1);
3419
3420 ecoff_data (abfd)->sym_filepos = sym_base;
3421
3422 if ((abfd->flags & D_PAGED) != 0)
3423 text_size = ecoff_sizeof_headers (abfd, false);
3424 else
3425 text_size = 0;
3426 text_start = 0;
3427 data_size = 0;
3428 data_start = 0;
3429 bss_size = 0;
3430
3431 /* Write section headers to the file. */
3432
3433 internal_f.f_nscns = 0;
3434 if (bfd_seek (abfd, (file_ptr) (FILHSZ + AOUTSZ), SEEK_SET) != 0)
3435 return false;
3436 for (current = abfd->sections;
3437 current != (asection *) NULL;
3438 current = current->next)
3439 {
3440 struct internal_scnhdr section;
3441 bfd_vma vma;
3442
3443 if (strcmp (current->name, SCOMMON) == 0)
3444 {
3445 BFD_ASSERT (bfd_get_section_size_before_reloc (current) == 0
3446 && current->reloc_count == 0);
3447 continue;
3448 }
3449
3450 ++internal_f.f_nscns;
3451
3452 strncpy (section.s_name, current->name, sizeof section.s_name);
3453
3454 /* FIXME: is this correct for shared libraries? I think it is
3455 but I have no platform to check. Ian Lance Taylor. */
3456 vma = bfd_get_section_vma (abfd, current);
3457 if (strcmp (current->name, _LIB) == 0)
3458 section.s_vaddr = 0;
3459 else
3460 section.s_vaddr = vma;
3461
3462 section.s_paddr = vma;
3463 section.s_size = bfd_get_section_size_before_reloc (current);
3464
3465 /* If this section has no size or is unloadable then the scnptr
3466 will be 0 too. */
3467 if (current->_raw_size == 0
3468 || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3469 section.s_scnptr = 0;
3470 else
3471 section.s_scnptr = current->filepos;
3472 section.s_relptr = current->rel_filepos;
3473
3474 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
3475 object file produced by the assembler is supposed to point to
3476 information about how much room is required by objects of
3477 various different sizes. I think this only matters if we
3478 want the linker to compute the best size to use, or
3479 something. I don't know what happens if the information is
3480 not present. */
3481 section.s_lnnoptr = 0;
3482
3483 section.s_nreloc = current->reloc_count;
3484 section.s_nlnno = 0;
3485 section.s_flags = ecoff_sec_to_styp_flags (current->name,
3486 current->flags);
3487
3488 {
3489 SCNHDR buff;
3490
3491 ecoff_swap_scnhdr_out (abfd, (PTR) &section, (PTR) &buff);
3492 if (bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
3493 return false;
3494 }
3495
3496 if ((section.s_flags & STYP_TEXT) != 0)
3497 {
3498 text_size += bfd_get_section_size_before_reloc (current);
3499 if (text_start == 0 || text_start > vma)
3500 text_start = vma;
3501 }
3502 else if ((section.s_flags & STYP_RDATA) != 0
3503 || (section.s_flags & STYP_DATA) != 0
3504 || (section.s_flags & STYP_LIT8) != 0
3505 || (section.s_flags & STYP_LIT4) != 0
3506 || (section.s_flags & STYP_SDATA) != 0)
3507 {
3508 data_size += bfd_get_section_size_before_reloc (current);
3509 if (data_start == 0 || data_start > vma)
3510 data_start = vma;
3511 }
3512 else if ((section.s_flags & STYP_BSS) != 0
3513 || (section.s_flags & STYP_SBSS) != 0)
3514 bss_size += bfd_get_section_size_before_reloc (current);
3515 }
3516
3517 /* Set up the file header. */
3518
3519 if (abfd->xvec->header_byteorder_big_p != false)
3520 internal_f.f_magic = MIPS_MAGIC_BIG;
3521 else
3522 internal_f.f_magic = MIPS_MAGIC_LITTLE;
3523
3524 /*
3525 We will NOT put a fucking timestamp in the header here. Every time you
3526 put it back, I will come in and take it out again. I'm sorry. This
3527 field does not belong here. We fill it with a 0 so it compares the
3528 same but is not a reasonable time. -- gnu@cygnus.com
3529 */
3530 internal_f.f_timdat = 0;
3531
3532 if (bfd_get_symcount (abfd) != 0)
3533 {
3534 /* The ECOFF f_nsyms field is not actually the number of
3535 symbols, it's the size of symbolic information header. */
3536 internal_f.f_nsyms = sizeof (struct hdr_ext);
3537 internal_f.f_symptr = sym_base;
3538 }
3539 else
3540 {
3541 internal_f.f_nsyms = 0;
3542 internal_f.f_symptr = 0;
3543 }
3544
3545 internal_f.f_opthdr = AOUTSZ;
3546
3547 internal_f.f_flags = F_LNNO;
3548 if (reloc_size == 0)
3549 internal_f.f_flags |= F_RELFLG;
3550 if (bfd_get_symcount (abfd) == 0)
3551 internal_f.f_flags |= F_LSYMS;
3552 if (abfd->flags & EXEC_P)
3553 internal_f.f_flags |= F_EXEC;
3554
3555 if (! abfd->xvec->byteorder_big_p)
3556 internal_f.f_flags |= F_AR32WR;
3557 else
3558 internal_f.f_flags |= F_AR32W;
3559
3560 /* Set up the ``optional'' header. */
3561 if ((abfd->flags & D_PAGED) != 0)
3562 internal_a.magic = ZMAGIC;
3563 else
3564 internal_a.magic = OMAGIC;
3565
3566 /* FIXME: This is what Ultrix puts in, and it makes the Ultrix
3567 linker happy. But, is it right? */
3568 internal_a.vstamp = 0x20a;
3569
3570 /* At least on Ultrix, these have to be rounded to page boundaries.
3571 FIXME: Is this true on other platforms? */
3572 if ((abfd->flags & D_PAGED) != 0)
3573 {
3574 internal_a.tsize = (text_size + ROUND_SIZE - 1) &~ (ROUND_SIZE - 1);
3575 internal_a.text_start = text_start &~ (ROUND_SIZE - 1);
3576 internal_a.dsize = (data_size + ROUND_SIZE - 1) &~ (ROUND_SIZE - 1);
3577 internal_a.data_start = data_start &~ (ROUND_SIZE - 1);
3578 }
3579 else
3580 {
3581 internal_a.tsize = text_size;
3582 internal_a.text_start = text_start;
3583 internal_a.dsize = data_size;
3584 internal_a.data_start = data_start;
3585 }
3586
3587 /* On Ultrix, the initial portions of the .sbss and .bss segments
3588 are at the end of the data section. The bsize field in the
3589 optional header records how many bss bytes are required beyond
3590 those in the data section. The value is not rounded to a page
3591 boundary. */
3592 if (bss_size < internal_a.dsize - data_size)
3593 bss_size = 0;
3594 else
3595 bss_size -= internal_a.dsize - data_size;
3596 internal_a.bsize = bss_size;
3597 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
3598
3599 internal_a.entry = bfd_get_start_address (abfd);
3600
3601 internal_a.gp_value = ecoff_data (abfd)->gp;
3602
3603 internal_a.gprmask = ecoff_data (abfd)->gprmask;
3604 for (i = 0; i < 4; i++)
3605 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
3606
3607 /* Write out the file header and the optional header. */
3608
3609 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3610 return false;
3611
3612 {
3613 FILHDR buff;
3614 ecoff_swap_filehdr_out (abfd, (PTR) &internal_f, (PTR) &buff);
3615 if (bfd_write ((PTR) &buff, 1, FILHSZ, abfd) != FILHSZ)
3616 return false;
3617 }
3618
3619 {
3620 AOUTHDR buff;
3621
3622 ecoff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3623 if (bfd_write ((PTR) &buff, 1, AOUTSZ, abfd) != AOUTSZ)
3624 return false;
3625 }
3626
3627 /* Write out the relocs. */
3628 for (current = abfd->sections;
3629 current != (asection *) NULL;
3630 current = current->next)
3631 {
3632 RELOC *buff;
3633 arelent **reloc_ptr_ptr;
3634 arelent **reloc_end;
3635 RELOC *out_ptr;
3636
3637 if (current->reloc_count == 0)
3638 continue;
3639
3640 buff = (RELOC *) bfd_alloc (abfd, current->reloc_count * RELSZ);
3641 if (buff == (RELOC *) NULL)
3642 {
3643 bfd_error = no_memory;
3644 return false;
3645 }
3646
3647 reloc_ptr_ptr = current->orelocation;
3648 reloc_end = reloc_ptr_ptr + current->reloc_count;
3649 out_ptr = buff;
3650 for (; reloc_ptr_ptr < reloc_end; reloc_ptr_ptr++, out_ptr++)
3651 {
3652 arelent *reloc;
3653 asymbol *sym;
3654 struct internal_reloc in;
3655
3656 memset (&in, 0, sizeof in);
3657
3658 reloc = *reloc_ptr_ptr;
3659 sym = *reloc->sym_ptr_ptr;
3660
3661 /* This must be an ECOFF reloc. */
3662 BFD_ASSERT (reloc->howto != (reloc_howto_type *) NULL
3663 && reloc->howto >= ecoff_howto_table
3664 && (reloc->howto
3665 < (ecoff_howto_table + ECOFF_HOWTO_COUNT)));
3666
3667 in.r_vaddr = reloc->address + bfd_get_section_vma (abfd, current);
3668 in.r_type = reloc->howto->type;
3669
3670 /* If this is a REFHI reloc, the next one must be a REFLO
3671 reloc for the same symbol. */
3672 BFD_ASSERT (in.r_type != ECOFF_R_REFHI
3673 || (reloc_ptr_ptr < reloc_end
3674 && (reloc_ptr_ptr[1]->howto
3675 != (reloc_howto_type *) NULL)
3676 && (reloc_ptr_ptr[1]->howto->type
3677 == ECOFF_R_REFLO)
3678 && (sym == *reloc_ptr_ptr[1]->sym_ptr_ptr)));
3679
3680 if ((sym->flags & BSF_SECTION_SYM) == 0)
3681 {
3682 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
3683 in.r_extern = 1;
3684 }
3685 else
3686 {
3687 CONST char *name;
3688
3689 name = bfd_get_section_name (abfd, bfd_get_section (sym));
3690 if (strcmp (name, ".text") == 0)
3691 in.r_symndx = RELOC_SECTION_TEXT;
3692 else if (strcmp (name, ".rdata") == 0)
3693 in.r_symndx = RELOC_SECTION_RDATA;
3694 else if (strcmp (name, ".data") == 0)
3695 in.r_symndx = RELOC_SECTION_DATA;
3696 else if (strcmp (name, ".sdata") == 0)
3697 in.r_symndx = RELOC_SECTION_SDATA;
3698 else if (strcmp (name, ".sbss") == 0)
3699 in.r_symndx = RELOC_SECTION_SBSS;
3700 else if (strcmp (name, ".bss") == 0)
3701 in.r_symndx = RELOC_SECTION_BSS;
3702 else if (strcmp (name, ".init") == 0)
3703 in.r_symndx = RELOC_SECTION_INIT;
3704 else if (strcmp (name, ".lit8") == 0)
3705 in.r_symndx = RELOC_SECTION_LIT8;
3706 else if (strcmp (name, ".lit4") == 0)
3707 in.r_symndx = RELOC_SECTION_LIT4;
3708 else
3709 abort ();
3710 in.r_extern = 0;
3711 }
3712
3713 ecoff_swap_reloc_out (abfd, (PTR) &in, (PTR) out_ptr);
3714 }
3715
3716 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
3717 return false;
3718 if (bfd_write ((PTR) buff, RELSZ, current->reloc_count, abfd)
3719 != RELSZ * current->reloc_count)
3720 return false;
3721 bfd_release (abfd, (PTR) buff);
3722 }
3723
3724 /* Write out the symbolic debugging information. */
3725 if (bfd_get_symcount (abfd) > 0)
3726 {
3727 HDRR *symhdr;
3728 unsigned long sym_offset;
3729 struct hdr_ext buff;
3730
3731 /* Set up the offsets in the symbolic header. */
3732 symhdr = &ecoff_data (abfd)->symbolic_header;
3733 sym_offset = ecoff_data (abfd)->sym_filepos + sizeof (struct hdr_ext);
3734
3735 #define SET(offset, size, ptr) \
3736 if (symhdr->size == 0) \
3737 symhdr->offset = 0; \
3738 else \
3739 symhdr->offset = (((char *) ecoff_data (abfd)->ptr \
3740 - (char *) ecoff_data (abfd)->raw_syments) \
3741 + sym_offset);
3742
3743 SET (cbLineOffset, cbLine, line);
3744 SET (cbDnOffset, idnMax, external_dnr);
3745 SET (cbPdOffset, ipdMax, external_pdr);
3746 SET (cbSymOffset, isymMax, external_sym);
3747 SET (cbOptOffset, ioptMax, external_opt);
3748 SET (cbAuxOffset, iauxMax, external_aux);
3749 SET (cbSsOffset, issMax, ss);
3750 SET (cbSsExtOffset, issExtMax, ssext);
3751 SET (cbFdOffset, ifdMax, external_fdr);
3752 SET (cbRfdOffset, crfd, external_rfd);
3753 SET (cbExtOffset, iextMax, external_ext);
3754 #undef SET
3755
3756 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos,
3757 SEEK_SET) != 0)
3758 return false;
3759 ecoff_swap_hdr_out (abfd, &ecoff_data (abfd)->symbolic_header, &buff);
3760 if (bfd_write ((PTR) &buff, 1, sizeof buff, abfd) != sizeof buff)
3761 return false;
3762 if (bfd_write ((PTR) ecoff_data (abfd)->raw_syments, 1,
3763 ecoff_data (abfd)->raw_size, abfd)
3764 != ecoff_data (abfd)->raw_size)
3765 return false;
3766 }
3767 else if ((abfd->flags & EXEC_P) != 0
3768 && (abfd->flags & D_PAGED) != 0)
3769 {
3770 char c;
3771
3772 /* A demand paged executable must occupy an even number of
3773 pages. */
3774 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3775 SEEK_SET) != 0)
3776 return false;
3777 if (bfd_read (&c, 1, 1, abfd) == 0)
3778 c = 0;
3779 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3780 SEEK_SET) != 0)
3781 return false;
3782 if (bfd_write (&c, 1, 1, abfd) != 1)
3783 return false;
3784 }
3785
3786 return true;
3787 }
3788 \f
3789 /* Archive handling. ECOFF uses what appears to be a unique type of
3790 archive header (which I call an armap). The byte ordering of the
3791 armap and the contents are encoded in the name of the armap itself.
3792 At least for now, we only support archives with the same byte
3793 ordering in the armap and the contents.
3794
3795 The first four bytes in the armap are the number of symbol
3796 definitions. This is always a power of two.
3797
3798 This is followed by the symbol definitions. Each symbol definition
3799 occupies 8 bytes. The first four bytes are the offset from the
3800 start of the armap strings to the null-terminated string naming
3801 this symbol. The second four bytes are the file offset to the
3802 archive member which defines this symbol. If the second four bytes
3803 are 0, then this is not actually a symbol definition, and it should
3804 be ignored.
3805
3806 The symbols are hashed into the armap with a closed hashing scheme.
3807 See the functions below for the details of the algorithm.
3808
3809 We could use the hash table when looking up symbols in a library.
3810 This would require a new BFD target entry point to replace the
3811 bfd_get_next_mapent function used by the linker.
3812
3813 After the symbol definitions comes four bytes holding the size of
3814 the string table, followed by the string table itself. */
3815
3816 /* The name of an archive headers looks like this:
3817 __________E[BL]E[BL]_ (with a trailing space).
3818 The trailing space is changed to an X if the archive is changed to
3819 indicate that the armap is out of date. */
3820
3821 #define ARMAP_BIG_ENDIAN 'B'
3822 #define ARMAP_LITTLE_ENDIAN 'L'
3823 #define ARMAP_MARKER 'E'
3824 #define ARMAP_START "__________"
3825 #define ARMAP_HEADER_MARKER_INDEX 10
3826 #define ARMAP_HEADER_ENDIAN_INDEX 11
3827 #define ARMAP_OBJECT_MARKER_INDEX 12
3828 #define ARMAP_OBJECT_ENDIAN_INDEX 13
3829 #define ARMAP_END_INDEX 14
3830 #define ARMAP_END "_ "
3831
3832 /* This is a magic number used in the hashing algorithm. */
3833 #define ARMAP_HASH_MAGIC 0x9dd68ab5
3834
3835 /* This returns the hash value to use for a string. It also sets
3836 *REHASH to the rehash adjustment if the first slot is taken. SIZE
3837 is the number of entries in the hash table, and HLOG is the log
3838 base 2 of SIZE. */
3839
3840 static unsigned int
3841 ecoff_armap_hash (s, rehash, size, hlog)
3842 CONST char *s;
3843 unsigned int *rehash;
3844 unsigned int size;
3845 unsigned int hlog;
3846 {
3847 unsigned int hash;
3848
3849 hash = *s++;
3850 while (*s != '\0')
3851 hash = ((hash >> 27) | (hash << 5)) + *s++;
3852 hash *= ARMAP_HASH_MAGIC;
3853 *rehash = (hash & (size - 1)) | 1;
3854 return hash >> (32 - hlog);
3855 }
3856
3857 /* Read in the armap. */
3858
3859 static boolean
3860 ecoff_slurp_armap (abfd)
3861 bfd *abfd;
3862 {
3863 char nextname[17];
3864 unsigned int i;
3865 struct areltdata *mapdata;
3866 bfd_size_type parsed_size;
3867 char *raw_armap;
3868 struct artdata *ardata;
3869 unsigned int count;
3870 char *raw_ptr;
3871 struct symdef *symdef_ptr;
3872 char *stringbase;
3873
3874 /* Get the name of the first element. */
3875 i = bfd_read ((PTR) nextname, 1, 16, abfd);
3876 if (i == 0)
3877 return true;
3878 if (i != 16)
3879 return false;
3880
3881 bfd_seek (abfd, (file_ptr) -16, SEEK_CUR);
3882
3883 /* See if the first element is an armap. */
3884 if (strncmp (nextname, ARMAP_START, sizeof ARMAP_START - 1) != 0
3885 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3886 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3887 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3888 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3889 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3890 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3891 || strncmp (nextname + ARMAP_END_INDEX,
3892 ARMAP_END, sizeof ARMAP_END - 1) != 0)
3893 {
3894 bfd_has_map (abfd) = false;
3895 return true;
3896 }
3897
3898 /* Make sure we have the right byte ordering. */
3899 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3900 ^ (abfd->xvec->header_byteorder_big_p != false))
3901 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3902 ^ (abfd->xvec->byteorder_big_p != false)))
3903 {
3904 bfd_error = wrong_format;
3905 return false;
3906 }
3907
3908 /* Read in the armap. */
3909 ardata = bfd_ardata (abfd);
3910 mapdata = snarf_ar_hdr (abfd);
3911 if (mapdata == (struct areltdata *) NULL)
3912 return false;
3913 parsed_size = mapdata->parsed_size;
3914 bfd_release (abfd, (PTR) mapdata);
3915
3916 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3917 if (raw_armap == (char *) NULL)
3918 {
3919 bfd_error = no_memory;
3920 return false;
3921 }
3922
3923 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3924 {
3925 bfd_error = malformed_archive;
3926 bfd_release (abfd, (PTR) raw_armap);
3927 return false;
3928 }
3929
3930 count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3931
3932 ardata->symdef_count = 0;
3933 ardata->cache = (struct ar_cache *) NULL;
3934
3935 /* Hack: overlay the symdefs on top of the raw archive data. This
3936 is the way do_slurp_bsd_armap works. */
3937 raw_ptr = raw_armap + LONG_SIZE;
3938 symdef_ptr = (struct symdef *) raw_ptr;
3939 ardata->symdefs = (carsym *) symdef_ptr;
3940 stringbase = raw_ptr + count * (2 * LONG_SIZE) + LONG_SIZE;
3941
3942 #ifdef CHECK_ARMAP_HASH
3943 {
3944 unsigned int hlog;
3945
3946 /* Double check that I have the hashing algorithm right by making
3947 sure that every symbol can be looked up successfully. */
3948 hlog = 0;
3949 for (i = 1; i < count; i <<= 1)
3950 hlog++;
3951 BFD_ASSERT (i == count);
3952
3953 for (i = 0; i < count; i++, raw_ptr += 2 * LONG_SIZE)
3954 {
3955 unsigned int name_offset, file_offset;
3956 unsigned int hash, rehash, srch;
3957
3958 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3959 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + LONG_SIZE));
3960 if (file_offset == 0)
3961 continue;
3962 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3963 hlog);
3964 if (hash == i)
3965 continue;
3966
3967 /* See if we can rehash to this location. */
3968 for (srch = (hash + rehash) & (count - 1);
3969 srch != hash && srch != i;
3970 srch = (srch + rehash) & (count - 1))
3971 BFD_ASSERT (bfd_h_get_32 (abfd,
3972 (PTR) (raw_armap
3973 + LONG_SIZE
3974 + (srch * 2 * LONG_SIZE)
3975 + LONG_SIZE))
3976 != 0);
3977 BFD_ASSERT (srch == i);
3978 }
3979 }
3980
3981 raw_ptr = raw_armap + LONG_SIZE;
3982 #endif /* CHECK_ARMAP_HASH */
3983
3984 for (i = 0; i < count; i++, raw_ptr += 2 * LONG_SIZE)
3985 {
3986 unsigned int name_offset, file_offset;
3987
3988 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3989 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + LONG_SIZE));
3990 if (file_offset == 0)
3991 continue;
3992 symdef_ptr->s.name = stringbase + name_offset;
3993 symdef_ptr->file_offset = file_offset;
3994 ++symdef_ptr;
3995 ++ardata->symdef_count;
3996 }
3997
3998 ardata->first_file_filepos = bfd_tell (abfd);
3999 /* Pad to an even boundary. */
4000 ardata->first_file_filepos += ardata->first_file_filepos % 2;
4001
4002 bfd_has_map (abfd) = true;
4003
4004 return true;
4005 }
4006
4007 /* Write out an armap. */
4008
4009 static boolean
4010 ecoff_write_armap (abfd, elength, map, orl_count, stridx)
4011 bfd *abfd;
4012 unsigned int elength;
4013 struct orl *map;
4014 unsigned int orl_count;
4015 int stridx;
4016 {
4017 unsigned int hashsize, hashlog;
4018 unsigned int symdefsize;
4019 int padit;
4020 unsigned int stringsize;
4021 unsigned int mapsize;
4022 file_ptr firstreal;
4023 struct ar_hdr hdr;
4024 struct stat statbuf;
4025 unsigned int i;
4026 bfd_byte temp[LONG_SIZE];
4027 bfd_byte *hashtable;
4028 bfd *current;
4029 bfd *last_elt;
4030
4031 /* Ultrix appears to use as a hash table size the least power of two
4032 greater than twice the number of entries. */
4033 for (hashlog = 0; (1 << hashlog) <= 2 * orl_count; hashlog++)
4034 ;
4035 hashsize = 1 << hashlog;
4036
4037 symdefsize = hashsize * 2 * LONG_SIZE;
4038 padit = stridx % 2;
4039 stringsize = stridx + padit;
4040
4041 /* Include 8 bytes to store symdefsize and stringsize in output. */
4042 mapsize = LONG_SIZE + symdefsize + stringsize + LONG_SIZE;
4043
4044 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
4045
4046 memset ((PTR) &hdr, 0, sizeof hdr);
4047
4048 /* Work out the ECOFF armap name. */
4049 strcpy (hdr.ar_name, ARMAP_START);
4050 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
4051 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
4052 (abfd->xvec->header_byteorder_big_p
4053 ? ARMAP_BIG_ENDIAN
4054 : ARMAP_LITTLE_ENDIAN);
4055 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
4056 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
4057 abfd->xvec->byteorder_big_p ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
4058 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
4059
4060 /* Write the timestamp of the archive header to be just a little bit
4061 later than the timestamp of the file, otherwise the linker will
4062 complain that the index is out of date. Actually, the Ultrix
4063 linker just checks the archive name; the GNU linker may check the
4064 date. */
4065 stat (abfd->filename, &statbuf);
4066 sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
4067
4068 /* The DECstation uses zeroes for the uid, gid and mode of the
4069 armap. */
4070 hdr.ar_uid[0] = '0';
4071 hdr.ar_gid[0] = '0';
4072 hdr.ar_mode[0] = '0';
4073
4074 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
4075
4076 hdr.ar_fmag[0] = '`';
4077 hdr.ar_fmag[1] = '\n';
4078
4079 /* Turn all null bytes in the header into spaces. */
4080 for (i = 0; i < sizeof (struct ar_hdr); i++)
4081 if (((char *)(&hdr))[i] == '\0')
4082 (((char *)(&hdr))[i]) = ' ';
4083
4084 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
4085 != sizeof (struct ar_hdr))
4086 return false;
4087
4088 bfd_h_put_32 (abfd, hashsize, temp);
4089 if (bfd_write (temp, 1, LONG_SIZE, abfd) != LONG_SIZE)
4090 return false;
4091
4092 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
4093
4094 current = abfd->archive_head;
4095 last_elt = current;
4096 for (i = 0; i < orl_count; i++)
4097 {
4098 unsigned int hash, rehash;
4099
4100 /* Advance firstreal to the file position of this archive
4101 element. */
4102 if (((bfd *) map[i].pos) != last_elt)
4103 {
4104 do
4105 {
4106 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
4107 firstreal += firstreal % 2;
4108 current = current->next;
4109 }
4110 while (current != (bfd *) map[i].pos);
4111 }
4112
4113 last_elt = current;
4114
4115 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
4116 if (bfd_h_get_32 (abfd, (PTR) (hashtable
4117 + (hash * 2 * LONG_SIZE)
4118 + LONG_SIZE))
4119 != 0)
4120 {
4121 unsigned int srch;
4122
4123 /* The desired slot is already taken. */
4124 for (srch = (hash + rehash) & (hashsize - 1);
4125 srch != hash;
4126 srch = (srch + rehash) & (hashsize - 1))
4127 if (bfd_h_get_32 (abfd, (PTR) (hashtable
4128 + (srch * 2 * LONG_SIZE)
4129 + LONG_SIZE))
4130 == 0)
4131 break;
4132
4133 BFD_ASSERT (srch != hash);
4134
4135 hash = srch;
4136 }
4137
4138 bfd_h_put_32 (abfd, map[i].namidx,
4139 (PTR) (hashtable + hash * 2 * LONG_SIZE));
4140 bfd_h_put_32 (abfd, firstreal,
4141 (PTR) (hashtable + hash * 2 * LONG_SIZE + LONG_SIZE));
4142 }
4143
4144 if (bfd_write (hashtable, 1, symdefsize, abfd) != symdefsize)
4145 return false;
4146
4147 bfd_release (abfd, hashtable);
4148
4149 /* Now write the strings. */
4150 bfd_h_put_32 (abfd, stringsize, temp);
4151 if (bfd_write (temp, 1, LONG_SIZE, abfd) != LONG_SIZE)
4152 return false;
4153 for (i = 0; i < orl_count; i++)
4154 {
4155 bfd_size_type len;
4156
4157 len = strlen (*map[i].name) + 1;
4158 if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
4159 return false;
4160 }
4161
4162 /* The spec sez this should be a newline. But in order to be
4163 bug-compatible for DECstation ar we use a null. */
4164 if (padit)
4165 {
4166 if (bfd_write ("\0", 1, 1, abfd) != 1)
4167 return false;
4168 }
4169
4170 return true;
4171 }
4172
4173 /* We just use the generic extended name support. This is a GNU
4174 extension. */
4175 #define ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table
4176
4177 /* See whether this BFD is an archive. If it is, read in the armap
4178 and the extended name table. */
4179
4180 static bfd_target *
4181 ecoff_archive_p (abfd)
4182 bfd *abfd;
4183 {
4184 char armag[SARMAG + 1];
4185
4186 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG
4187 || strncmp (armag, ARMAG, SARMAG) != 0)
4188 {
4189 bfd_error = wrong_format;
4190 return (bfd_target *) NULL;
4191 }
4192
4193 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
4194 involves a cast, we can't do it as the left operand of
4195 assignment. */
4196 abfd->tdata.aout_ar_data =
4197 (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
4198
4199 if (bfd_ardata (abfd) == (struct artdata *) NULL)
4200 {
4201 bfd_error = no_memory;
4202 return (bfd_target *) NULL;
4203 }
4204
4205 bfd_ardata (abfd)->first_file_filepos = SARMAG;
4206
4207 if (ecoff_slurp_armap (abfd) == false
4208 || ecoff_slurp_extended_name_table (abfd) == false)
4209 {
4210 bfd_release (abfd, bfd_ardata (abfd));
4211 abfd->tdata.aout_ar_data = (struct artdata *) NULL;
4212 return (bfd_target *) NULL;
4213 }
4214
4215 return abfd->xvec;
4216 }
4217 \f
4218 #ifdef HOST_IRIX4
4219
4220 #include <core.out.h>
4221
4222 struct sgi_core_struct
4223 {
4224 int sig;
4225 char cmd[CORE_NAMESIZE];
4226 };
4227
4228 #define core_hdr(bfd) ((bfd)->tdata.sgi_core_data)
4229 #define core_signal(bfd) (core_hdr(bfd)->sig)
4230 #define core_command(bfd) (core_hdr(bfd)->cmd)
4231
4232 static asection *
4233 make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
4234 bfd *abfd;
4235 CONST char *name;
4236 flagword flags;
4237 bfd_size_type _raw_size;
4238 bfd_vma vma;
4239 file_ptr filepos;
4240 {
4241 asection *asect;
4242
4243 asect = bfd_make_section (abfd, name);
4244 if (!asect)
4245 return NULL;
4246
4247 asect->flags = flags;
4248 asect->_raw_size = _raw_size;
4249 asect->vma = vma;
4250 asect->filepos = filepos;
4251 asect->alignment_power = 4;
4252
4253 return asect;
4254 }
4255
4256 static bfd_target *
4257 ecoff_core_file_p (abfd)
4258 bfd *abfd;
4259 {
4260 int val;
4261 int i;
4262 char *secname;
4263 struct coreout coreout;
4264 struct idesc *idg, *idf, *ids;
4265
4266 val = bfd_read ((PTR)&coreout, 1, sizeof coreout, abfd);
4267 if (val != sizeof coreout)
4268 return 0;
4269
4270 if (coreout.c_magic != CORE_MAGIC
4271 || coreout.c_version != CORE_VERSION1)
4272 return 0;
4273
4274 core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, sizeof (struct sgi_core_struct));
4275 if (!core_hdr (abfd))
4276 return NULL;
4277
4278 strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE);
4279 core_signal (abfd) = coreout.c_sigcause;
4280
4281 bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET);
4282
4283 for (i = 0; i < coreout.c_nvmap; i++)
4284 {
4285 struct vmap vmap;
4286
4287 val = bfd_read ((PTR)&vmap, 1, sizeof vmap, abfd);
4288 if (val != sizeof vmap)
4289 break;
4290
4291 switch (vmap.v_type)
4292 {
4293 case VDATA:
4294 secname = ".data";
4295 break;
4296 case VSTACK:
4297 secname = ".stack";
4298 break;
4299 default:
4300 continue;
4301 }
4302
4303 if (!make_bfd_asection (abfd, secname,
4304 SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
4305 vmap.v_len,
4306 vmap.v_vaddr,
4307 vmap.v_offset,
4308 2))
4309 return NULL;
4310 }
4311
4312 /* Make sure that the regs are contiguous within the core file. */
4313
4314 idg = &coreout.c_idesc[I_GPREGS];
4315 idf = &coreout.c_idesc[I_FPREGS];
4316 ids = &coreout.c_idesc[I_SPECREGS];
4317
4318 if (idg->i_offset + idg->i_len != idf->i_offset
4319 || idf->i_offset + idf->i_len != ids->i_offset)
4320 return 0; /* Can't deal with non-contig regs */
4321
4322 bfd_seek (abfd, idg->i_offset, SEEK_SET);
4323
4324 make_bfd_asection (abfd, ".reg",
4325 SEC_ALLOC+SEC_HAS_CONTENTS,
4326 idg->i_len + idf->i_len + ids->i_len,
4327 0,
4328 idg->i_offset);
4329
4330 /* OK, we believe you. You're a core file (sure, sure). */
4331
4332 return abfd->xvec;
4333 }
4334
4335 static char *
4336 ecoff_core_file_failing_command (abfd)
4337 bfd *abfd;
4338 {
4339 return core_command (abfd);
4340 }
4341
4342 static int
4343 ecoff_core_file_failing_signal (abfd)
4344 bfd *abfd;
4345 {
4346 return core_signal (abfd);
4347 }
4348
4349 static boolean
4350 ecoff_core_file_matches_executable_p (core_bfd, exec_bfd)
4351 bfd *core_bfd, *exec_bfd;
4352 {
4353 return true; /* XXX - FIXME */
4354 }
4355 #else /* not def HOST_IRIX4 */
4356 #define ecoff_core_file_p _bfd_dummy_target
4357 #define ecoff_core_file_failing_command _bfd_dummy_core_file_failing_command
4358 #define ecoff_core_file_failing_signal _bfd_dummy_core_file_failing_signal
4359 #define ecoff_core_file_matches_executable_p \
4360 _bfd_dummy_core_file_matches_executable_p
4361 #endif
4362 \f
4363 /* This is the COFF backend structure. The backend_data field of the
4364 bfd_target structure is set to this. The section reading code in
4365 coffgen.c uses this structure. */
4366
4367 static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = {
4368 (void (*) PARAMS ((bfd *,PTR,int,int,PTR))) bfd_void, /* aux_in */
4369 (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */
4370 (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_in */
4371 (unsigned (*) PARAMS ((bfd *,PTR,int,int,PTR))) bfd_void, /* aux_out */
4372 (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_out */
4373 (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_out */
4374 ecoff_swap_reloc_out, ecoff_swap_filehdr_out, ecoff_swap_aouthdr_out,
4375 ecoff_swap_scnhdr_out,
4376 FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, true,
4377 ecoff_swap_filehdr_in, ecoff_swap_aouthdr_in, ecoff_swap_scnhdr_in,
4378 ecoff_bad_format_hook, ecoff_set_arch_mach_hook, ecoff_mkobject_hook,
4379 ecoff_styp_to_sec_flags, ecoff_make_section_hook, ecoff_set_alignment_hook,
4380 ecoff_slurp_symbol_table
4381 };
4382
4383 /* get_lineno could be written for ECOFF, but it would currently only
4384 be useful for linking ECOFF and COFF files together, which doesn't
4385 seem too likely. */
4386 #define ecoff_get_lineno \
4387 ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr)
4388
4389 /* These bfd_target functions are defined in other files. */
4390
4391 #define ecoff_truncate_arname bfd_dont_truncate_arname
4392 #define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file
4393 #define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt
4394 #define ecoff_get_section_contents bfd_generic_get_section_contents
4395 #define ecoff_get_reloc_upper_bound coff_get_reloc_upper_bound
4396 #define ecoff_close_and_cleanup bfd_generic_close_and_cleanup
4397 #define ecoff_bfd_debug_info_start bfd_void
4398 #define ecoff_bfd_debug_info_end bfd_void
4399 #define ecoff_bfd_debug_info_accumulate \
4400 ((void (*) PARAMS ((bfd *, struct sec *))) bfd_void)
4401 #define ecoff_bfd_get_relocated_section_contents \
4402 bfd_generic_get_relocated_section_contents
4403 #define ecoff_bfd_relax_section bfd_generic_relax_section
4404 #define ecoff_bfd_make_debug_symbol \
4405 ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
4406
4407 bfd_target ecoff_little_vec =
4408 {
4409 "ecoff-littlemips", /* name */
4410 bfd_target_ecoff_flavour,
4411 false, /* data byte order is little */
4412 false, /* header byte order is little */
4413
4414 (HAS_RELOC | EXEC_P | /* object flags */
4415 HAS_LINENO | HAS_DEBUG |
4416 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
4417
4418 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect
4419 flags */
4420 0, /* leading underscore */
4421 ' ', /* ar_pad_char */
4422 15, /* ar_max_namelen */
4423 4, /* minimum alignment power */
4424 _do_getl64, _do_getl_signed_64, _do_putl64,
4425 _do_getl32, _do_getl_signed_32, _do_putl32,
4426 _do_getl16, _do_getl_signed_16, _do_putl16, /* data */
4427 _do_getl64, _do_getl_signed_64, _do_putl64,
4428 _do_getl32, _do_getl_signed_32, _do_putl32,
4429 _do_getl16, _do_getl_signed_16, _do_putl16, /* hdrs */
4430
4431 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
4432 ecoff_archive_p, _bfd_dummy_target},
4433 {bfd_false, ecoff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
4434 bfd_false},
4435 {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */
4436 _bfd_write_archive_contents, bfd_false},
4437 JUMP_TABLE (ecoff),
4438 (PTR) &bfd_ecoff_std_swap_table
4439 };
4440
4441 bfd_target ecoff_big_vec =
4442 {
4443 "ecoff-bigmips", /* name */
4444 bfd_target_ecoff_flavour,
4445 true, /* data byte order is big */
4446 true, /* header byte order is big */
4447
4448 (HAS_RELOC | EXEC_P | /* object flags */
4449 HAS_LINENO | HAS_DEBUG |
4450 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
4451
4452 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect flags */
4453 0, /* leading underscore */
4454 ' ', /* ar_pad_char */
4455 15, /* ar_max_namelen */
4456 4, /* minimum alignment power */
4457 _do_getb64, _do_getb_signed_64, _do_putb64,
4458 _do_getb32, _do_getb_signed_32, _do_putb32,
4459 _do_getb16, _do_getb_signed_16, _do_putb16,
4460 _do_getb64, _do_getb_signed_64, _do_putb64,
4461 _do_getb32, _do_getb_signed_32, _do_putb32,
4462 _do_getb16, _do_getb_signed_16, _do_putb16,
4463 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
4464 ecoff_archive_p, ecoff_core_file_p},
4465 {bfd_false, ecoff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
4466 bfd_false},
4467 {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */
4468 _bfd_write_archive_contents, bfd_false},
4469 JUMP_TABLE(ecoff),
4470 (PTR) &bfd_ecoff_std_swap_table
4471 /* Note that there is another bfd_target just above this one. If
4472 you are adding initializers here, you should be adding them there
4473 as well. */
4474 };
This page took 0.120781 seconds and 4 git commands to generate.