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