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