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