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