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