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