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