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