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