OSDN Git Service

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