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