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