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