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