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