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