Distinguish a weak defined symbol from a regular defined symbol.
[external/binutils.git] / bfd / ecoff.c
1 /* Generic ECOFF (Extended-COFF) routines.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3    Original version by Per Bothner.
4    Full support added by Ian Lance Taylor, ian@cygnus.com.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "aout/ar.h"
27 #include "aout/ranlib.h"
28 #include "aout/stab_gnu.h"
29
30 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
31    some other stuff which we don't want and which conflicts with stuff
32    we do want.  */
33 #include "libaout.h"
34 #include "aout/aout64.h"
35 #undef N_ABS
36 #undef exec_hdr
37 #undef obj_sym_filepos
38
39 #include "coff/internal.h"
40 #include "coff/sym.h"
41 #include "coff/symconst.h"
42 #include "coff/ecoff.h"
43 #include "libcoff.h"
44 #include "libecoff.h"
45 \f
46 /* Prototypes for static functions.  */
47
48 static int ecoff_get_magic PARAMS ((bfd *abfd));
49 static long ecoff_sec_to_styp_flags PARAMS ((const char *name,
50                                              flagword flags));
51 static boolean ecoff_slurp_symbolic_header PARAMS ((bfd *abfd));
52 static boolean ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym,
53                                            asymbol *asym, int ext,
54                                            asymbol **indirect_ptr_ptr));
55 static void ecoff_emit_aggregate PARAMS ((bfd *abfd, FDR *fdr,
56                                           char *string,
57                                           RNDXR *rndx, long isym,
58                                           const char *which));
59 static char *ecoff_type_to_string PARAMS ((bfd *abfd, FDR *fdr,
60                                            unsigned int indx));
61 static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section,
62                                                 asymbol **symbols));
63 static void ecoff_compute_section_file_positions PARAMS ((bfd *abfd));
64 static bfd_size_type ecoff_compute_reloc_file_positions PARAMS ((bfd *abfd));
65 static boolean ecoff_get_extr PARAMS ((asymbol *, EXTR *));
66 static void ecoff_set_index PARAMS ((asymbol *, bfd_size_type));
67 static unsigned int ecoff_armap_hash PARAMS ((CONST char *s,
68                                               unsigned int *rehash,
69                                               unsigned int size,
70                                               unsigned int hlog));
71 \f
72 /* This stuff is somewhat copied from coffcode.h.  */
73
74 static asection bfd_debug_section = { "*DEBUG*" };
75
76 /* Create an ECOFF object.  */
77
78 boolean
79 _bfd_ecoff_mkobject (abfd)
80      bfd *abfd;
81 {
82   abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *)
83                                 bfd_zalloc (abfd, sizeof (ecoff_data_type)));
84   if (abfd->tdata.ecoff_obj_data == NULL)
85     {
86       bfd_set_error (bfd_error_no_memory);
87       return false;
88     }
89
90   return true;
91 }
92
93 /* This is a hook called by coff_real_object_p to create any backend
94    specific information.  */
95
96 PTR
97 _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr)
98      bfd *abfd;
99      PTR filehdr;
100      PTR aouthdr;
101 {
102   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
103   struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
104   ecoff_data_type *ecoff;
105
106   if (_bfd_ecoff_mkobject (abfd) == false)
107     return NULL;
108
109   ecoff = ecoff_data (abfd);
110   ecoff->gp_size = 8;
111   ecoff->sym_filepos = internal_f->f_symptr;
112
113   if (internal_a != (struct internal_aouthdr *) NULL)
114     {
115       int i;
116
117       ecoff->text_start = internal_a->text_start;
118       ecoff->text_end = internal_a->text_start + internal_a->tsize;
119       ecoff->gp = internal_a->gp_value;
120       ecoff->gprmask = internal_a->gprmask;
121       for (i = 0; i < 4; i++)
122         ecoff->cprmask[i] = internal_a->cprmask[i];
123       ecoff->fprmask = internal_a->fprmask;
124       if (internal_a->magic == ECOFF_AOUT_ZMAGIC)
125         abfd->flags |= D_PAGED;
126     }
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 /* Provided a BFD, a section and an offset into the section, calculate
2006    and return the name of the source file and the line nearest to the
2007    wanted location.  */
2008
2009 /*ARGSUSED*/
2010 boolean
2011 _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset,
2012                               filename_ptr, functionname_ptr, retline_ptr)
2013      bfd *abfd;
2014      asection *section;
2015      asymbol **ignore_symbols;
2016      bfd_vma offset;
2017      CONST char **filename_ptr;
2018      CONST char **functionname_ptr;
2019      unsigned int *retline_ptr;
2020 {
2021   const struct ecoff_debug_swap * const debug_swap
2022     = &ecoff_backend (abfd)->debug_swap;
2023   struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
2024   FDR *fdr_ptr;
2025   FDR *fdr_start;
2026   FDR *fdr_end;
2027   FDR *fdr_hold;
2028   boolean stabs;
2029
2030   offset += section->vma;
2031
2032   /* If we're not in the .text section, we don't have any line
2033      numbers.  */
2034   if (strcmp (section->name, _TEXT) != 0
2035       || offset < ecoff_data (abfd)->text_start
2036       || offset >= ecoff_data (abfd)->text_end)
2037     return false;
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   /* Each file descriptor (FDR) has a memory address.  Here we track
2045      down which FDR we want.  The FDR's are stored in increasing
2046      memory order.  If speed is ever important, this can become a
2047      binary search.  We must ignore FDR's with no PDR entries; they
2048      will have the adr of the FDR before or after them.  */
2049   fdr_start = debug_info->fdr;
2050   fdr_end = fdr_start + debug_info->symbolic_header.ifdMax;
2051   fdr_hold = (FDR *) NULL;
2052   for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
2053     {
2054       if (fdr_ptr->cpd == 0)
2055         continue;
2056       if (offset < fdr_ptr->adr)
2057         break;
2058       fdr_hold = fdr_ptr;
2059     }
2060   if (fdr_hold == (FDR *) NULL)
2061     return false;
2062   fdr_ptr = fdr_hold;
2063
2064   /* Check whether this file has stabs debugging information.  In a
2065      file with stabs debugging information, the second local symbol is
2066      named @stabs.  */
2067   stabs = false;
2068   if (fdr_ptr->csym >= 2)
2069     {
2070       char *sym_ptr;
2071       SYMR sym;
2072
2073       sym_ptr = ((char *) debug_info->external_sym
2074                  + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
2075       (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2076       if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
2077                   STABS_SYMBOL) == 0)
2078         stabs = true;
2079     }
2080
2081   if (! stabs)
2082     {
2083       bfd_size_type external_pdr_size;
2084       char *pdr_ptr;
2085       char *pdr_end;
2086       PDR pdr;
2087       bfd_vma first_off;
2088       unsigned char *line_ptr;
2089       unsigned char *line_end;
2090       int lineno;
2091
2092       /* This file uses ECOFF debugging information.  Each FDR has a
2093          list of procedure descriptors (PDR).  PDR's also have an
2094          address, which is relative to the FDR address, and are also
2095          stored in increasing memory order.  */
2096       if (offset < fdr_ptr->adr)
2097         return false;
2098       offset -= fdr_ptr->adr;
2099       external_pdr_size = debug_swap->external_pdr_size;
2100       pdr_ptr = ((char *) debug_info->external_pdr
2101                  + fdr_ptr->ipdFirst * external_pdr_size);
2102       pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size;
2103       (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2104
2105       /* The address of the first PDR is an offset which applies to
2106          the addresses of all the PDR's.  */
2107       first_off = pdr.adr;
2108
2109       for (pdr_ptr += external_pdr_size;
2110            pdr_ptr < pdr_end;
2111            pdr_ptr += external_pdr_size)
2112         {
2113           (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2114           if (offset < pdr.adr - first_off)
2115             break;
2116         }
2117
2118       /* Now we can look for the actual line number.  The line numbers
2119          are stored in a very funky format, which I won't try to
2120          describe.  Note that right here pdr_ptr and pdr hold the PDR
2121          *after* the one we want; we need this to compute line_end.  */
2122       line_end = debug_info->line;
2123       if (pdr_ptr == pdr_end)
2124         line_end += fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2125       else
2126         line_end += fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2127
2128       /* Now change pdr and pdr_ptr to the one we want.  */
2129       pdr_ptr -= external_pdr_size;
2130       (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2131
2132       offset -= pdr.adr - first_off;
2133       lineno = pdr.lnLow;
2134       line_ptr = debug_info->line + fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2135       while (line_ptr < line_end)
2136         {
2137           int delta;
2138           int count;
2139
2140           delta = *line_ptr >> 4;
2141           if (delta >= 0x8)
2142             delta -= 0x10;
2143           count = (*line_ptr & 0xf) + 1;
2144           ++line_ptr;
2145           if (delta == -8)
2146             {
2147               delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2148               if (delta >= 0x8000)
2149                 delta -= 0x10000;
2150               line_ptr += 2;
2151             }
2152           lineno += delta;
2153           if (offset < count * 4)
2154             break;
2155           offset -= count * 4;
2156         }
2157
2158       /* If fdr_ptr->rss is -1, then this file does not have full
2159          symbols, at least according to gdb/mipsread.c.  */
2160       if (fdr_ptr->rss == -1)
2161         {
2162           *filename_ptr = NULL;
2163           if (pdr.isym == -1)
2164             *functionname_ptr = NULL;
2165           else
2166             {
2167               EXTR proc_ext;
2168
2169               (*debug_swap->swap_ext_in)
2170                 (abfd,
2171                  ((char *) debug_info->external_ext
2172                   + pdr.isym * debug_swap->external_ext_size),
2173                  &proc_ext);
2174               *functionname_ptr = debug_info->ssext + proc_ext.asym.iss;
2175             }
2176         }
2177       else
2178         {
2179           SYMR proc_sym;
2180
2181           *filename_ptr = debug_info->ss + fdr_ptr->issBase + fdr_ptr->rss;
2182           (*debug_swap->swap_sym_in)
2183             (abfd,
2184              ((char *) debug_info->external_sym
2185               + (fdr_ptr->isymBase + pdr.isym) * debug_swap->external_sym_size),
2186              &proc_sym);
2187           *functionname_ptr = debug_info->ss + fdr_ptr->issBase + proc_sym.iss;
2188         }
2189       if (lineno == ilineNil)
2190         lineno = 0;
2191       *retline_ptr = lineno;
2192     }
2193   else
2194     {
2195       bfd_size_type external_sym_size;
2196       const char *directory_name;
2197       const char *main_file_name;
2198       const char *current_file_name;
2199       const char *function_name;
2200       const char *line_file_name;
2201       bfd_vma low_func_vma;
2202       bfd_vma low_line_vma;
2203       char *sym_ptr, *sym_ptr_end;
2204       size_t len, funclen;
2205       char *buffer = NULL;
2206
2207       /* This file uses stabs debugging information.  */
2208
2209       *filename_ptr = NULL;
2210       *functionname_ptr = NULL;
2211       *retline_ptr = 0;
2212
2213       directory_name = NULL;
2214       main_file_name = NULL;
2215       current_file_name = NULL;
2216       function_name = NULL;
2217       line_file_name = NULL;
2218       low_func_vma = 0;
2219       low_line_vma = 0;
2220
2221       external_sym_size = debug_swap->external_sym_size;
2222
2223       sym_ptr = ((char *) debug_info->external_sym
2224                  + (fdr_ptr->isymBase + 2) * external_sym_size);
2225       sym_ptr_end = sym_ptr + fdr_ptr->csym * external_sym_size;
2226       for (; sym_ptr < sym_ptr_end; sym_ptr += external_sym_size)
2227         {
2228           SYMR sym;
2229
2230           (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2231
2232           if (ECOFF_IS_STAB (&sym))
2233             {
2234               switch (ECOFF_UNMARK_STAB (sym.index))
2235                 {
2236                 case N_SO:
2237                   main_file_name = current_file_name =
2238                     debug_info->ss + fdr_ptr->issBase + sym.iss;
2239
2240                   /* Check the next symbol to see if it is also an
2241                      N_SO symbol.  */
2242                   if (sym_ptr + external_sym_size < sym_ptr_end)
2243                     {
2244                       SYMR nextsym;
2245
2246                       (*debug_swap->swap_sym_in) (abfd,
2247                                                   sym_ptr + external_sym_size,
2248                                                   &nextsym);
2249                       if (ECOFF_IS_STAB (&nextsym)
2250                           && ECOFF_UNMARK_STAB (nextsym.index) == N_SO)
2251                         {
2252                           directory_name = current_file_name;
2253                           main_file_name = current_file_name =
2254                             debug_info->ss + fdr_ptr->issBase + sym.iss;
2255                           sym_ptr += external_sym_size;
2256                         }
2257                     }
2258                   break;
2259
2260                 case N_SOL:
2261                   current_file_name =
2262                     debug_info->ss + fdr_ptr->issBase + sym.iss;
2263                   break;
2264
2265                 case N_FUN:
2266                   if (sym.value >= low_func_vma
2267                       && sym.value <= offset + section->vma)
2268                     {
2269                       low_func_vma = sym.value;
2270                       function_name =
2271                         debug_info->ss + fdr_ptr->issBase + sym.iss;
2272                     }
2273                   break;
2274                 }
2275             }
2276           else if (sym.st == stLabel && sym.index != indexNil)
2277             {
2278               if (sym.value > offset + section->vma)
2279                 {
2280                   /* We have passed the location in the file we are
2281                      looking for, so we can get out of the loop.  */
2282                   break;
2283                 }
2284
2285               if (sym.value >= low_line_vma)
2286                 {
2287                   low_line_vma = sym.value;
2288                   line_file_name = current_file_name;
2289                   *retline_ptr = sym.index;
2290                 }
2291             }
2292         }
2293
2294       if (*retline_ptr != 0)
2295         main_file_name = line_file_name;
2296
2297       /* We need to remove the stuff after the colon in the function
2298          name.  We also need to put the directory name and the file
2299          name together.  */
2300       if (function_name == NULL)
2301         len = funclen = 0;
2302       else
2303         len = funclen = strlen (function_name) + 1;
2304
2305       if (main_file_name != NULL
2306           && directory_name != NULL
2307           && main_file_name[0] != '/')
2308         len += strlen (directory_name) + strlen (main_file_name) + 1;
2309
2310       if (len != 0)
2311         {
2312           if (ecoff_data (abfd)->find_buffer != NULL)
2313             free (ecoff_data (abfd)->find_buffer);
2314           buffer = (char *) malloc (len);
2315           if (buffer == NULL)
2316             {
2317               bfd_set_error (bfd_error_no_memory);
2318               return false;
2319             }
2320           ecoff_data (abfd)->find_buffer = buffer;
2321         }
2322
2323       if (function_name != NULL)
2324         {
2325           char *colon;
2326
2327           strcpy (buffer, function_name);
2328           colon = strchr (buffer, ':');
2329           if (colon != NULL)
2330             *colon = '\0';
2331           *functionname_ptr = buffer;
2332         }
2333
2334       if (main_file_name != NULL)
2335         {
2336           if (directory_name == NULL || main_file_name[0] == '/')
2337             *filename_ptr = main_file_name;
2338           else
2339             {
2340               sprintf (buffer + funclen, "%s%s", directory_name,
2341                        main_file_name);
2342               *filename_ptr = buffer + funclen;
2343             }
2344         }
2345     }
2346
2347   return true;
2348 }
2349 \f
2350 /* Copy private BFD data.  This is called by objcopy and strip.  We
2351    use it to copy the ECOFF debugging information from one BFD to the
2352    other.  It would be theoretically possible to represent the ECOFF
2353    debugging information in the symbol table.  However, it would be a
2354    lot of work, and there would be little gain (gas, gdb, and ld
2355    already access the ECOFF debugging information via the
2356    ecoff_debug_info structure, and that structure would have to be
2357    retained in order to support ECOFF debugging in MIPS ELF).
2358
2359    The debugging information for the ECOFF external symbols comes from
2360    the symbol table, so this function only handles the other debugging
2361    information.  */
2362
2363 boolean
2364 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd, obfd)
2365      bfd *ibfd;
2366      bfd *obfd;
2367 {
2368   struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
2369   struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
2370   register int i;
2371   asymbol **sym_ptr_ptr;
2372   size_t c;
2373   boolean local;
2374
2375   /* This function is selected based on the input vector.  We only
2376      want to copy information over if the output BFD also uses ECOFF
2377      format.  */
2378   if (bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
2379     return true;
2380
2381   /* Copy the GP value and the register masks.  */
2382   ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
2383   ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
2384   ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
2385   for (i = 0; i < 3; i++)
2386     ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
2387
2388   /* Copy the version stamp.  */
2389   oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
2390
2391   /* If there are no symbols, don't copy any debugging information.  */
2392   c = bfd_get_symcount (obfd);
2393   sym_ptr_ptr = bfd_get_outsymbols (obfd);
2394   if (c == 0 || sym_ptr_ptr == (asymbol **) NULL)
2395     return true;
2396
2397   /* See if there are any local symbols.  */
2398   local = false;
2399   for (; c > 0; c--, sym_ptr_ptr++)
2400     {
2401       if (ecoffsymbol (*sym_ptr_ptr)->local)
2402         {
2403           local = true;
2404           break;
2405         }
2406     }
2407
2408   if (local)
2409     {
2410       /* There are some local symbols.  We just bring over all the
2411          debugging information.  FIXME: This is not quite the right
2412          thing to do.  If the user has asked us to discard all
2413          debugging information, then we are probably going to wind up
2414          keeping it because there will probably be some local symbol
2415          which objcopy did not discard.  We should actually break
2416          apart the debugging information and only keep that which
2417          applies to the symbols we want to keep.  */
2418       oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
2419       oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
2420       oinfo->line = iinfo->line;
2421
2422       oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
2423       oinfo->external_dnr = iinfo->external_dnr;
2424
2425       oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
2426       oinfo->external_pdr = iinfo->external_pdr;
2427
2428       oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
2429       oinfo->external_sym = iinfo->external_sym;
2430
2431       oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
2432       oinfo->external_opt = iinfo->external_opt;
2433
2434       oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
2435       oinfo->external_aux = iinfo->external_aux;
2436
2437       oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
2438       oinfo->ss = iinfo->ss;
2439
2440       oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
2441       oinfo->external_fdr = iinfo->external_fdr;
2442
2443       oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
2444       oinfo->external_rfd = iinfo->external_rfd;
2445     }
2446   else
2447     {
2448       /* We are discarding all the local symbol information.  Look
2449          through the external symbols and remove all references to FDR
2450          or aux information.  */
2451       c = bfd_get_symcount (obfd);
2452       sym_ptr_ptr = bfd_get_outsymbols (obfd);
2453       for (; c > 0; c--, sym_ptr_ptr++)
2454         {
2455           EXTR esym;
2456
2457           (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
2458             (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
2459           esym.ifd = ifdNil;
2460           esym.asym.index = indexNil;
2461           (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
2462             (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
2463         }
2464     }
2465
2466   return true;
2467 }
2468 \f
2469 /* Set the architecture.  The supported architecture is stored in the
2470    backend pointer.  We always set the architecture anyhow, since many
2471    callers ignore the return value.  */
2472
2473 boolean
2474 _bfd_ecoff_set_arch_mach (abfd, arch, machine)
2475      bfd *abfd;
2476      enum bfd_architecture arch;
2477      unsigned long machine;
2478 {
2479   bfd_default_set_arch_mach (abfd, arch, machine);
2480   return arch == ecoff_backend (abfd)->arch;
2481 }
2482
2483 /* Get the size of the section headers.  */
2484
2485 /*ARGSUSED*/
2486 int
2487 _bfd_ecoff_sizeof_headers (abfd, reloc)
2488      bfd *abfd;
2489      boolean reloc;
2490 {
2491   asection *current;
2492   int c;
2493   int ret;
2494
2495   c = 0;
2496   for (current = abfd->sections;
2497        current != (asection *)NULL; 
2498        current = current->next) 
2499     ++c;
2500
2501   ret = (bfd_coff_filhsz (abfd)
2502          + bfd_coff_aoutsz (abfd)
2503          + c * bfd_coff_scnhsz (abfd));
2504   return BFD_ALIGN (ret, 16);
2505 }
2506
2507 /* Get the contents of a section.  */
2508
2509 boolean
2510 _bfd_ecoff_get_section_contents (abfd, section, location, offset, count)
2511      bfd *abfd;
2512      asection *section;
2513      PTR location;
2514      file_ptr offset;
2515      bfd_size_type count;
2516 {
2517   return _bfd_generic_get_section_contents (abfd, section, location,
2518                                             offset, count);
2519 }
2520
2521 /* Calculate the file position for each section, and set
2522    reloc_filepos.  */
2523
2524 static void
2525 ecoff_compute_section_file_positions (abfd)
2526      bfd *abfd;
2527 {
2528   asection *current;
2529   file_ptr sofar;
2530   file_ptr old_sofar;
2531   boolean first_data;
2532
2533   sofar = _bfd_ecoff_sizeof_headers (abfd, false);
2534
2535   first_data = true;
2536   for (current = abfd->sections;
2537        current != (asection *) NULL;
2538        current = current->next)
2539     {
2540       unsigned int alignment_power;
2541
2542       /* Only deal with sections which have contents */
2543       if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) == 0)
2544         continue;
2545
2546       /* For the Alpha ECOFF .pdata section the lnnoptr field is
2547          supposed to indicate the number of .pdata entries that are
2548          really in the section.  Each entry is 8 bytes.  We store this
2549          away in line_filepos before increasing the section size.  */
2550       if (strcmp (current->name, _PDATA) != 0)
2551         alignment_power = current->alignment_power;
2552       else
2553         {
2554           current->line_filepos = current->_raw_size / 8;
2555           alignment_power = 4;
2556         }
2557
2558       /* On Ultrix, the data sections in an executable file must be
2559          aligned to a page boundary within the file.  This does not
2560          affect the section size, though.  FIXME: Does this work for
2561          other platforms?  It requires some modification for the
2562          Alpha, because .rdata on the Alpha goes with the text, not
2563          the data.  */
2564       if ((abfd->flags & EXEC_P) != 0
2565           && (abfd->flags & D_PAGED) != 0
2566           && first_data != false
2567           && (current->flags & SEC_CODE) == 0
2568           && (! ecoff_backend (abfd)->rdata_in_text
2569               || strcmp (current->name, _RDATA) != 0)
2570           && strcmp (current->name, _PDATA) != 0)
2571         {
2572           const bfd_vma round = ecoff_backend (abfd)->round;
2573
2574           sofar = (sofar + round - 1) &~ (round - 1);
2575           first_data = false;
2576         }
2577       else if (strcmp (current->name, _LIB) == 0)
2578         {
2579           const bfd_vma round = ecoff_backend (abfd)->round;
2580           /* On Irix 4, the location of contents of the .lib section
2581              from a shared library section is also rounded up to a
2582              page boundary.  */
2583
2584           sofar = (sofar + round - 1) &~ (round - 1);
2585         }
2586
2587       /* Align the sections in the file to the same boundary on
2588          which they are aligned in virtual memory.  */
2589       old_sofar = sofar;
2590       sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2591
2592       current->filepos = sofar;
2593
2594       sofar += current->_raw_size;
2595
2596       /* make sure that this section is of the right size too */
2597       old_sofar = sofar;
2598       sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2599       current->_raw_size += sofar - old_sofar;
2600     }
2601
2602   ecoff_data (abfd)->reloc_filepos = sofar;
2603 }
2604
2605 /* Determine the location of the relocs for all the sections in the
2606    output file, as well as the location of the symbolic debugging
2607    information.  */
2608
2609 static bfd_size_type
2610 ecoff_compute_reloc_file_positions (abfd)
2611      bfd *abfd;
2612 {
2613   const bfd_size_type external_reloc_size =
2614     ecoff_backend (abfd)->external_reloc_size;
2615   file_ptr reloc_base;
2616   bfd_size_type reloc_size;
2617   asection *current;
2618   file_ptr sym_base;
2619
2620   if (! abfd->output_has_begun)
2621     {
2622       ecoff_compute_section_file_positions (abfd);
2623       abfd->output_has_begun = true;
2624     }
2625   
2626   reloc_base = ecoff_data (abfd)->reloc_filepos;
2627
2628   reloc_size = 0;
2629   for (current = abfd->sections;
2630        current != (asection *)NULL; 
2631        current = current->next) 
2632     {
2633       if (current->reloc_count == 0)
2634         current->rel_filepos = 0;
2635       else
2636         {
2637           bfd_size_type relsize;
2638
2639           current->rel_filepos = reloc_base;
2640           relsize = current->reloc_count * external_reloc_size;
2641           reloc_size += relsize;
2642           reloc_base += relsize;
2643         }
2644     }
2645
2646   sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2647
2648   /* At least on Ultrix, the symbol table of an executable file must
2649      be aligned to a page boundary.  FIXME: Is this true on other
2650      platforms?  */
2651   if ((abfd->flags & EXEC_P) != 0
2652       && (abfd->flags & D_PAGED) != 0)
2653     sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2654                 &~ (ecoff_backend (abfd)->round - 1));
2655
2656   ecoff_data (abfd)->sym_filepos = sym_base;
2657
2658   return reloc_size;
2659 }
2660
2661 /* Set the contents of a section.  */
2662
2663 boolean
2664 _bfd_ecoff_set_section_contents (abfd, section, location, offset, count)
2665      bfd *abfd;
2666      asection *section;
2667      PTR location;
2668      file_ptr offset;
2669      bfd_size_type count;
2670 {
2671   /* This must be done first, because bfd_set_section_contents is
2672      going to set output_has_begun to true.  */
2673   if (abfd->output_has_begun == false)
2674     ecoff_compute_section_file_positions (abfd);
2675
2676   /* If this is a .lib section, bump the vma address so that it winds
2677      up being the number of .lib sections output.  This is right for
2678      Irix 4.  Ian Taylor <ian@cygnus.com>.  */
2679   if (strcmp (section->name, _LIB) == 0)
2680     ++section->vma;
2681
2682   if (count == 0)
2683     return true;
2684
2685   if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0
2686       || bfd_write (location, 1, count, abfd) != count)
2687     return false;
2688
2689   return true;
2690 }
2691
2692 /* Get the GP value for an ECOFF file.  This is a hook used by
2693    nlmconv.  */
2694
2695 bfd_vma
2696 bfd_ecoff_get_gp_value (abfd)
2697      bfd *abfd;
2698 {
2699   if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2700       || bfd_get_format (abfd) != bfd_object)
2701     {
2702       bfd_set_error (bfd_error_invalid_operation);
2703       return 0;
2704     }
2705   
2706   return ecoff_data (abfd)->gp;
2707 }
2708
2709 /* Set the GP value for an ECOFF file.  This is a hook used by the
2710    assembler.  */
2711
2712 boolean
2713 bfd_ecoff_set_gp_value (abfd, gp_value)
2714      bfd *abfd;
2715      bfd_vma gp_value;
2716 {
2717   if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2718       || bfd_get_format (abfd) != bfd_object)
2719     {
2720       bfd_set_error (bfd_error_invalid_operation);
2721       return false;
2722     }
2723
2724   ecoff_data (abfd)->gp = gp_value;
2725
2726   return true;
2727 }
2728
2729 /* Set the register masks for an ECOFF file.  This is a hook used by
2730    the assembler.  */
2731
2732 boolean
2733 bfd_ecoff_set_regmasks (abfd, gprmask, fprmask, cprmask)
2734      bfd *abfd;
2735      unsigned long gprmask;
2736      unsigned long fprmask;
2737      unsigned long *cprmask;
2738 {
2739   ecoff_data_type *tdata;
2740
2741   if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2742       || bfd_get_format (abfd) != bfd_object)
2743     {
2744       bfd_set_error (bfd_error_invalid_operation);
2745       return false;
2746     }
2747
2748   tdata = ecoff_data (abfd);
2749   tdata->gprmask = gprmask;
2750   tdata->fprmask = fprmask;
2751   if (cprmask != (unsigned long *) NULL)
2752     {
2753       register int i;
2754
2755       for (i = 0; i < 3; i++)
2756         tdata->cprmask[i] = cprmask[i];
2757     }
2758
2759   return true;
2760 }
2761
2762 /* Get ECOFF EXTR information for an external symbol.  This function
2763    is passed to bfd_ecoff_debug_externals.  */
2764
2765 static boolean
2766 ecoff_get_extr (sym, esym)
2767      asymbol *sym;
2768      EXTR *esym;
2769 {
2770   ecoff_symbol_type *ecoff_sym_ptr;
2771   bfd *input_bfd;
2772
2773   if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2774       || ecoffsymbol (sym)->native == NULL)
2775     {
2776       /* Don't include debugging, local, or section symbols.  */
2777       if ((sym->flags & BSF_DEBUGGING) != 0
2778           || (sym->flags & BSF_LOCAL) != 0
2779           || (sym->flags & BSF_SECTION_SYM) != 0)
2780         return false;
2781
2782       esym->jmptbl = 0;
2783       esym->cobol_main = 0;
2784       esym->weakext = 0;
2785       esym->reserved = 0;
2786       esym->ifd = ifdNil;
2787       /* FIXME: we can do better than this for st and sc.  */
2788       esym->asym.st = stGlobal;
2789       esym->asym.sc = scAbs;
2790       esym->asym.reserved = 0;
2791       esym->asym.index = indexNil;
2792       return true;
2793     }
2794
2795   ecoff_sym_ptr = ecoffsymbol (sym);
2796
2797   if (ecoff_sym_ptr->local)
2798     return false;
2799
2800   input_bfd = bfd_asymbol_bfd (sym);
2801   (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2802     (input_bfd, ecoff_sym_ptr->native, esym);
2803
2804   /* If the symbol was defined by the linker, then esym will be
2805      undefined but sym will not be.  Get a better class for such a
2806      symbol.  */
2807   if ((esym->asym.sc == scUndefined
2808        || esym->asym.sc == scSUndefined)
2809       && ! bfd_is_und_section (bfd_get_section (sym)))
2810     esym->asym.sc = scAbs;
2811
2812   /* Adjust the FDR index for the symbol by that used for the input
2813      BFD.  */
2814   if (esym->ifd != -1)
2815     {
2816       struct ecoff_debug_info *input_debug;
2817
2818       input_debug = &ecoff_data (input_bfd)->debug_info;
2819       BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2820       if (input_debug->ifdmap != (RFDT *) NULL)
2821         esym->ifd = input_debug->ifdmap[esym->ifd];
2822     }
2823
2824   return true;
2825 }
2826
2827 /* Set the external symbol index.  This routine is passed to
2828    bfd_ecoff_debug_externals.  */
2829
2830 static void
2831 ecoff_set_index (sym, indx)
2832      asymbol *sym;
2833      bfd_size_type indx;
2834 {
2835   ecoff_set_sym_index (sym, indx);
2836 }
2837
2838 /* Write out an ECOFF file.  */
2839
2840 boolean
2841 _bfd_ecoff_write_object_contents (abfd)
2842      bfd *abfd;
2843 {
2844   const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2845   const bfd_vma round = backend->round;
2846   const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2847   const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2848   const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2849   const bfd_size_type external_hdr_size
2850     = backend->debug_swap.external_hdr_size;
2851   const bfd_size_type external_reloc_size = backend->external_reloc_size;
2852   void (* const adjust_reloc_out) PARAMS ((bfd *,
2853                                            const arelent *,
2854                                            struct internal_reloc *))
2855     = backend->adjust_reloc_out;
2856   void (* const swap_reloc_out) PARAMS ((bfd *,
2857                                          const struct internal_reloc *,
2858                                          PTR))
2859     = backend->swap_reloc_out;
2860   struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2861   HDRR * const symhdr = &debug->symbolic_header;
2862   asection *current;
2863   unsigned int count;
2864   bfd_size_type reloc_size;
2865   bfd_size_type text_size;
2866   bfd_vma text_start;
2867   boolean set_text_start;
2868   bfd_size_type data_size;
2869   bfd_vma data_start;
2870   boolean set_data_start;
2871   bfd_size_type bss_size;
2872   PTR buff = NULL;
2873   PTR reloc_buff = NULL;
2874   struct internal_filehdr internal_f;
2875   struct internal_aouthdr internal_a;
2876   int i;
2877
2878   /* Determine where the sections and relocs will go in the output
2879      file.  */
2880   reloc_size = ecoff_compute_reloc_file_positions (abfd);
2881
2882   count = 1;
2883   for (current = abfd->sections;
2884        current != (asection *)NULL; 
2885        current = current->next) 
2886     {
2887       current->target_index = count;
2888       ++count;
2889     }
2890
2891   if ((abfd->flags & D_PAGED) != 0)
2892     text_size = _bfd_ecoff_sizeof_headers (abfd, false);
2893   else
2894     text_size = 0;
2895   text_start = 0;
2896   set_text_start = false;
2897   data_size = 0;
2898   data_start = 0;
2899   set_data_start = false;
2900   bss_size = 0;
2901
2902   /* Write section headers to the file.  */
2903
2904   /* Allocate buff big enough to hold a section header,
2905      file header, or a.out header.  */
2906   {
2907     bfd_size_type siz;
2908     siz = scnhsz;
2909     if (siz < filhsz)
2910       siz = filhsz;
2911     if (siz < aoutsz)
2912       siz = aoutsz;
2913     buff = (PTR) malloc (siz);
2914     if (buff == NULL)
2915       {
2916         bfd_set_error (bfd_error_no_memory);
2917         goto error_return;
2918       }
2919   }
2920
2921   internal_f.f_nscns = 0;
2922   if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2923     goto error_return;
2924   for (current = abfd->sections;
2925        current != (asection *) NULL;
2926        current = current->next)
2927     {
2928       struct internal_scnhdr section;
2929       bfd_vma vma;
2930
2931       ++internal_f.f_nscns;
2932
2933       strncpy (section.s_name, current->name, sizeof section.s_name);
2934
2935       /* This seems to be correct for Irix 4 shared libraries.  */
2936       vma = bfd_get_section_vma (abfd, current);
2937       if (strcmp (current->name, _LIB) == 0)
2938         section.s_vaddr = 0;
2939       else
2940         section.s_vaddr = vma;
2941
2942       section.s_paddr = vma;
2943       section.s_size = bfd_get_section_size_before_reloc (current);
2944
2945       /* If this section is unloadable then the scnptr will be 0.  */
2946       if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2947         section.s_scnptr = 0;
2948       else
2949         section.s_scnptr = current->filepos;
2950       section.s_relptr = current->rel_filepos;
2951
2952       /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2953          object file produced by the assembler is supposed to point to
2954          information about how much room is required by objects of
2955          various different sizes.  I think this only matters if we
2956          want the linker to compute the best size to use, or
2957          something.  I don't know what happens if the information is
2958          not present.  */
2959       if (strcmp (current->name, _PDATA) != 0)
2960         section.s_lnnoptr = 0;
2961       else
2962         {
2963           /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2964              hold the number of entries in the section (each entry is
2965              8 bytes).  We stored this in the line_filepos field in
2966              ecoff_compute_section_file_positions.  */
2967           section.s_lnnoptr = current->line_filepos;
2968         }
2969
2970       section.s_nreloc = current->reloc_count;
2971       section.s_nlnno = 0;
2972       section.s_flags = ecoff_sec_to_styp_flags (current->name,
2973                                                  current->flags);
2974
2975       bfd_coff_swap_scnhdr_out (abfd, (PTR) &section, buff);
2976       if (bfd_write (buff, 1, scnhsz, abfd) != scnhsz)
2977         goto error_return;
2978
2979       if ((section.s_flags & STYP_TEXT) != 0
2980           || ((section.s_flags & STYP_RDATA) != 0
2981               && backend->rdata_in_text)
2982           || strcmp (current->name, _PDATA) == 0)
2983         {
2984           text_size += bfd_get_section_size_before_reloc (current);
2985           if (! set_text_start || text_start > vma)
2986             {
2987               text_start = vma;
2988               set_text_start = true;
2989             }
2990         }
2991       else if ((section.s_flags & STYP_RDATA) != 0
2992                || (section.s_flags & STYP_DATA) != 0
2993                || (section.s_flags & STYP_LITA) != 0
2994                || (section.s_flags & STYP_LIT8) != 0
2995                || (section.s_flags & STYP_LIT4) != 0
2996                || (section.s_flags & STYP_SDATA) != 0
2997                || strcmp (current->name, _XDATA) == 0)
2998         {
2999           data_size += bfd_get_section_size_before_reloc (current);
3000           if (! set_data_start || data_start > vma)
3001             {
3002               data_start = vma;
3003               set_data_start = true;
3004             }
3005         }
3006       else if ((section.s_flags & STYP_BSS) != 0
3007                || (section.s_flags & STYP_SBSS) != 0)
3008         bss_size += bfd_get_section_size_before_reloc (current);
3009       else if ((section.s_flags & STYP_ECOFF_LIB) != 0)
3010         /* Do nothing */ ;
3011       else
3012         abort ();
3013     }   
3014
3015   /* Set up the file header.  */
3016
3017   internal_f.f_magic = ecoff_get_magic (abfd);
3018
3019   /* We will NOT put a fucking timestamp in the header here. Every
3020      time you put it back, I will come in and take it out again.  I'm
3021      sorry.  This field does not belong here.  We fill it with a 0 so
3022      it compares the same but is not a reasonable time. --
3023      gnu@cygnus.com.  */
3024   internal_f.f_timdat = 0;
3025
3026   if (bfd_get_symcount (abfd) != 0)
3027     {
3028       /* The ECOFF f_nsyms field is not actually the number of
3029          symbols, it's the size of symbolic information header.  */
3030       internal_f.f_nsyms = external_hdr_size;
3031       internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
3032     }
3033   else
3034     {
3035       internal_f.f_nsyms = 0;
3036       internal_f.f_symptr = 0;
3037     }
3038
3039   internal_f.f_opthdr = aoutsz;
3040
3041   internal_f.f_flags = F_LNNO;
3042   if (reloc_size == 0)
3043     internal_f.f_flags |= F_RELFLG;
3044   if (bfd_get_symcount (abfd) == 0)
3045     internal_f.f_flags |= F_LSYMS;
3046   if (abfd->flags & EXEC_P)
3047     internal_f.f_flags |= F_EXEC;
3048
3049   if (! abfd->xvec->byteorder_big_p)
3050     internal_f.f_flags |= F_AR32WR;
3051   else
3052     internal_f.f_flags |= F_AR32W;
3053
3054   /* Set up the ``optional'' header.  */
3055   if ((abfd->flags & D_PAGED) != 0)
3056     internal_a.magic = ECOFF_AOUT_ZMAGIC;
3057   else
3058     internal_a.magic = ECOFF_AOUT_OMAGIC;
3059
3060   /* FIXME: Is this really correct?  */
3061   internal_a.vstamp = symhdr->vstamp;
3062
3063   /* At least on Ultrix, these have to be rounded to page boundaries.
3064      FIXME: Is this true on other platforms?  */
3065   if ((abfd->flags & D_PAGED) != 0)
3066     {
3067       internal_a.tsize = (text_size + round - 1) &~ (round - 1);
3068       internal_a.text_start = text_start &~ (round - 1);
3069       internal_a.dsize = (data_size + round - 1) &~ (round - 1);
3070       internal_a.data_start = data_start &~ (round - 1);
3071     }
3072   else
3073     {
3074       internal_a.tsize = text_size;
3075       internal_a.text_start = text_start;
3076       internal_a.dsize = data_size;
3077       internal_a.data_start = data_start;
3078     }
3079
3080   /* On Ultrix, the initial portions of the .sbss and .bss segments
3081      are at the end of the data section.  The bsize field in the
3082      optional header records how many bss bytes are required beyond
3083      those in the data section.  The value is not rounded to a page
3084      boundary.  */
3085   if (bss_size < internal_a.dsize - data_size)
3086     bss_size = 0;
3087   else
3088     bss_size -= internal_a.dsize - data_size;
3089   internal_a.bsize = bss_size;
3090   internal_a.bss_start = internal_a.data_start + internal_a.dsize;
3091
3092   internal_a.entry = bfd_get_start_address (abfd);
3093
3094   internal_a.gp_value = ecoff_data (abfd)->gp;
3095
3096   internal_a.gprmask = ecoff_data (abfd)->gprmask;
3097   internal_a.fprmask = ecoff_data (abfd)->fprmask;
3098   for (i = 0; i < 4; i++)
3099     internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
3100
3101   /* Write out the file header and the optional header.  */
3102
3103   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3104     goto error_return;
3105
3106   bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, buff);
3107   if (bfd_write (buff, 1, filhsz, abfd) != filhsz)
3108     goto error_return;
3109
3110   bfd_coff_swap_aouthdr_out (abfd, (PTR) &internal_a, buff);
3111   if (bfd_write (buff, 1, aoutsz, abfd) != aoutsz)
3112     goto error_return;
3113
3114   /* Build the external symbol information.  This must be done before
3115      writing out the relocs so that we know the symbol indices.  We
3116      don't do this if this BFD was created by the backend linker,
3117      since it will have already handled the symbols and relocs.  */
3118   if (! ecoff_data (abfd)->linker)
3119     {
3120       symhdr->iextMax = 0;
3121       symhdr->issExtMax = 0;
3122       debug->external_ext = debug->external_ext_end = NULL;
3123       debug->ssext = debug->ssext_end = NULL;
3124       if (bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
3125                                      (((abfd->flags & EXEC_P) == 0)
3126                                       ? true : false),
3127                                      ecoff_get_extr, ecoff_set_index)
3128           == false)
3129         goto error_return;
3130
3131       /* Write out the relocs.  */
3132       for (current = abfd->sections;
3133            current != (asection *) NULL;
3134            current = current->next)
3135         {
3136           arelent **reloc_ptr_ptr;
3137           arelent **reloc_end;
3138           char *out_ptr;
3139
3140           if (current->reloc_count == 0)
3141             continue;
3142
3143           reloc_buff =
3144             bfd_alloc (abfd, current->reloc_count * external_reloc_size);
3145           if (reloc_buff == NULL)
3146             {
3147               bfd_set_error (bfd_error_no_memory);
3148               goto error_return;
3149             }
3150
3151           reloc_ptr_ptr = current->orelocation;
3152           reloc_end = reloc_ptr_ptr + current->reloc_count;
3153           out_ptr = (char *) reloc_buff;
3154           for (;
3155                reloc_ptr_ptr < reloc_end;
3156                reloc_ptr_ptr++, out_ptr += external_reloc_size)
3157             {
3158               arelent *reloc;
3159               asymbol *sym;
3160               struct internal_reloc in;
3161           
3162               memset ((PTR) &in, 0, sizeof in);
3163
3164               reloc = *reloc_ptr_ptr;
3165               sym = *reloc->sym_ptr_ptr;
3166
3167               in.r_vaddr = (reloc->address
3168                             + bfd_get_section_vma (abfd, current));
3169               in.r_type = reloc->howto->type;
3170
3171               if ((sym->flags & BSF_SECTION_SYM) == 0)
3172                 {
3173                   in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
3174                   in.r_extern = 1;
3175                 }
3176               else
3177                 {
3178                   CONST char *name;
3179
3180                   name = bfd_get_section_name (abfd, bfd_get_section (sym));
3181                   if (strcmp (name, ".text") == 0)
3182                     in.r_symndx = RELOC_SECTION_TEXT;
3183                   else if (strcmp (name, ".rdata") == 0)
3184                     in.r_symndx = RELOC_SECTION_RDATA;
3185                   else if (strcmp (name, ".data") == 0)
3186                     in.r_symndx = RELOC_SECTION_DATA;
3187                   else if (strcmp (name, ".sdata") == 0)
3188                     in.r_symndx = RELOC_SECTION_SDATA;
3189                   else if (strcmp (name, ".sbss") == 0)
3190                     in.r_symndx = RELOC_SECTION_SBSS;
3191                   else if (strcmp (name, ".bss") == 0)
3192                     in.r_symndx = RELOC_SECTION_BSS;
3193                   else if (strcmp (name, ".init") == 0)
3194                     in.r_symndx = RELOC_SECTION_INIT;
3195                   else if (strcmp (name, ".lit8") == 0)
3196                     in.r_symndx = RELOC_SECTION_LIT8;
3197                   else if (strcmp (name, ".lit4") == 0)
3198                     in.r_symndx = RELOC_SECTION_LIT4;
3199                   else if (strcmp (name, ".xdata") == 0)
3200                     in.r_symndx = RELOC_SECTION_XDATA;
3201                   else if (strcmp (name, ".pdata") == 0)
3202                     in.r_symndx = RELOC_SECTION_PDATA;
3203                   else if (strcmp (name, ".fini") == 0)
3204                     in.r_symndx = RELOC_SECTION_FINI;
3205                   else if (strcmp (name, ".lita") == 0)
3206                     in.r_symndx = RELOC_SECTION_LITA;
3207                   else if (strcmp (name, "*ABS*") == 0)
3208                     in.r_symndx = RELOC_SECTION_ABS;
3209                   else
3210                     abort ();
3211                   in.r_extern = 0;
3212                 }
3213
3214               (*adjust_reloc_out) (abfd, reloc, &in);
3215
3216               (*swap_reloc_out) (abfd, &in, (PTR) out_ptr);
3217             }
3218
3219           if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
3220             goto error_return;
3221           if (bfd_write (reloc_buff,
3222                          external_reloc_size, current->reloc_count, abfd)
3223               != external_reloc_size * current->reloc_count)
3224             goto error_return;
3225           bfd_release (abfd, reloc_buff);
3226           reloc_buff = NULL;
3227         }
3228
3229       /* Write out the symbolic debugging information.  */
3230       if (bfd_get_symcount (abfd) > 0)
3231         {
3232           /* Write out the debugging information.  */
3233           if (bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
3234                                      ecoff_data (abfd)->sym_filepos)
3235               == false)
3236             goto error_return;
3237         }
3238     }
3239
3240   /* The .bss section of a demand paged executable must receive an
3241      entire page.  If there are symbols, the symbols will start on the
3242      next page.  If there are no symbols, we must fill out the page by
3243      hand.  */
3244   if (bfd_get_symcount (abfd) == 0
3245       && (abfd->flags & EXEC_P) != 0
3246       && (abfd->flags & D_PAGED) != 0)
3247     {
3248       char c;
3249
3250       if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3251                     SEEK_SET) != 0)
3252         goto error_return;
3253       if (bfd_read (&c, 1, 1, abfd) == 0)
3254         c = 0;
3255       if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3256                     SEEK_SET) != 0)
3257         goto error_return;
3258       if (bfd_write (&c, 1, 1, abfd) != 1)
3259         goto error_return;
3260     }
3261
3262   if (reloc_buff != NULL)
3263     bfd_release (abfd, reloc_buff);
3264   if (buff != NULL)
3265     free (buff);
3266   return true;
3267  error_return:
3268   if (reloc_buff != NULL)
3269     bfd_release (abfd, reloc_buff);
3270   if (buff != NULL)
3271     free (buff);
3272   return false;
3273 }
3274 \f
3275 /* Archive handling.  ECOFF uses what appears to be a unique type of
3276    archive header (armap).  The byte ordering of the armap and the
3277    contents are encoded in the name of the armap itself.  At least for
3278    now, we only support archives with the same byte ordering in the
3279    armap and the contents.
3280
3281    The first four bytes in the armap are the number of symbol
3282    definitions.  This is always a power of two.
3283
3284    This is followed by the symbol definitions.  Each symbol definition
3285    occupies 8 bytes.  The first four bytes are the offset from the
3286    start of the armap strings to the null-terminated string naming
3287    this symbol.  The second four bytes are the file offset to the
3288    archive member which defines this symbol.  If the second four bytes
3289    are 0, then this is not actually a symbol definition, and it should
3290    be ignored.
3291
3292    The symbols are hashed into the armap with a closed hashing scheme.
3293    See the functions below for the details of the algorithm.
3294
3295    After the symbol definitions comes four bytes holding the size of
3296    the string table, followed by the string table itself.  */
3297
3298 /* The name of an archive headers looks like this:
3299    __________E[BL]E[BL]_ (with a trailing space).
3300    The trailing space is changed to an X if the archive is changed to
3301    indicate that the armap is out of date.
3302
3303    The Alpha seems to use ________64E[BL]E[BL]_.  */
3304
3305 #define ARMAP_BIG_ENDIAN 'B'
3306 #define ARMAP_LITTLE_ENDIAN 'L'
3307 #define ARMAP_MARKER 'E'
3308 #define ARMAP_START_LENGTH 10
3309 #define ARMAP_HEADER_MARKER_INDEX 10
3310 #define ARMAP_HEADER_ENDIAN_INDEX 11
3311 #define ARMAP_OBJECT_MARKER_INDEX 12
3312 #define ARMAP_OBJECT_ENDIAN_INDEX 13
3313 #define ARMAP_END_INDEX 14
3314 #define ARMAP_END "_ "
3315
3316 /* This is a magic number used in the hashing algorithm.  */
3317 #define ARMAP_HASH_MAGIC 0x9dd68ab5
3318
3319 /* This returns the hash value to use for a string.  It also sets
3320    *REHASH to the rehash adjustment if the first slot is taken.  SIZE
3321    is the number of entries in the hash table, and HLOG is the log
3322    base 2 of SIZE.  */
3323
3324 static unsigned int
3325 ecoff_armap_hash (s, rehash, size, hlog)
3326      CONST char *s;
3327      unsigned int *rehash;
3328      unsigned int size;
3329      unsigned int hlog;
3330 {
3331   unsigned int hash;
3332
3333   hash = *s++;
3334   while (*s != '\0')
3335     hash = ((hash >> 27) | (hash << 5)) + *s++;
3336   hash *= ARMAP_HASH_MAGIC;
3337   *rehash = (hash & (size - 1)) | 1;
3338   return hash >> (32 - hlog);
3339 }
3340
3341 /* Read in the armap.  */
3342
3343 boolean
3344 _bfd_ecoff_slurp_armap (abfd)
3345      bfd *abfd;
3346 {
3347   char nextname[17];
3348   unsigned int i;
3349   struct areltdata *mapdata;
3350   bfd_size_type parsed_size;
3351   char *raw_armap;
3352   struct artdata *ardata;
3353   unsigned int count;
3354   char *raw_ptr;
3355   struct symdef *symdef_ptr;
3356   char *stringbase;
3357   
3358   /* Get the name of the first element.  */
3359   i = bfd_read ((PTR) nextname, 1, 16, abfd);
3360   if (i == 0)
3361       return true;
3362   if (i != 16)
3363       return false;
3364
3365   if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
3366     return false;
3367
3368   /* Irix 4.0.5F apparently can use either an ECOFF armap or a
3369      standard COFF armap.  We could move the ECOFF armap stuff into
3370      bfd_slurp_armap, but that seems inappropriate since no other
3371      target uses this format.  Instead, we check directly for a COFF
3372      armap.  */
3373   if (strncmp (nextname, "/               ", 16) == 0)
3374     return bfd_slurp_armap (abfd);
3375
3376   /* See if the first element is an armap.  */
3377   if (strncmp (nextname, ecoff_backend (abfd)->armap_start,
3378                ARMAP_START_LENGTH) != 0
3379       || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3380       || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3381           && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3382       || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3383       || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3384           && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3385       || strncmp (nextname + ARMAP_END_INDEX,
3386                   ARMAP_END, sizeof ARMAP_END - 1) != 0)
3387     {
3388       bfd_has_map (abfd) = false;
3389       return true;
3390     }
3391
3392   /* Make sure we have the right byte ordering.  */
3393   if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3394        ^ (abfd->xvec->header_byteorder_big_p != false))
3395       || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3396           ^ (abfd->xvec->byteorder_big_p != false)))
3397     {
3398       bfd_set_error (bfd_error_wrong_format);
3399       return false;
3400     }
3401
3402   /* Read in the armap.  */
3403   ardata = bfd_ardata (abfd);
3404   mapdata = _bfd_snarf_ar_hdr (abfd);
3405   if (mapdata == (struct areltdata *) NULL)
3406     return false;
3407   parsed_size = mapdata->parsed_size;
3408   bfd_release (abfd, (PTR) mapdata);
3409     
3410   raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3411   if (raw_armap == (char *) NULL)
3412     {
3413       bfd_set_error (bfd_error_no_memory);
3414       return false;
3415     }
3416     
3417   if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3418     {
3419       if (bfd_get_error () != bfd_error_system_call)
3420         bfd_set_error (bfd_error_malformed_archive);
3421       bfd_release (abfd, (PTR) raw_armap);
3422       return false;
3423     }
3424     
3425   ardata->tdata = (PTR) raw_armap;
3426
3427   count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3428
3429   ardata->symdef_count = 0;
3430   ardata->cache = (struct ar_cache *) NULL;
3431
3432   /* This code used to overlay the symdefs over the raw archive data,
3433      but that doesn't work on a 64 bit host.  */
3434
3435   stringbase = raw_armap + count * 8 + 8;
3436
3437 #ifdef CHECK_ARMAP_HASH
3438   {
3439     unsigned int hlog;
3440
3441     /* Double check that I have the hashing algorithm right by making
3442        sure that every symbol can be looked up successfully.  */
3443     hlog = 0;
3444     for (i = 1; i < count; i <<= 1)
3445       hlog++;
3446     BFD_ASSERT (i == count);
3447
3448     raw_ptr = raw_armap + 4;
3449     for (i = 0; i < count; i++, raw_ptr += 8)
3450       {
3451         unsigned int name_offset, file_offset;
3452         unsigned int hash, rehash, srch;
3453       
3454         name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3455         file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3456         if (file_offset == 0)
3457           continue;
3458         hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3459                                  hlog);
3460         if (hash == i)
3461           continue;
3462
3463         /* See if we can rehash to this location.  */
3464         for (srch = (hash + rehash) & (count - 1);
3465              srch != hash && srch != i;
3466              srch = (srch + rehash) & (count - 1))
3467           BFD_ASSERT (bfd_h_get_32 (abfd, (PTR) (raw_armap + 8 + srch * 8))
3468                       != 0);
3469         BFD_ASSERT (srch == i);
3470       }
3471   }
3472
3473 #endif /* CHECK_ARMAP_HASH */
3474
3475   raw_ptr = raw_armap + 4;
3476   for (i = 0; i < count; i++, raw_ptr += 8)
3477     if (bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)) != 0)
3478       ++ardata->symdef_count;
3479
3480   symdef_ptr = ((struct symdef *)
3481                 bfd_alloc (abfd,
3482                            ardata->symdef_count * sizeof (struct symdef)));
3483   if (!symdef_ptr)
3484     {
3485       bfd_set_error (bfd_error_no_memory);
3486       return false;
3487     }
3488
3489   ardata->symdefs = (carsym *) symdef_ptr;
3490
3491   raw_ptr = raw_armap + 4;
3492   for (i = 0; i < count; i++, raw_ptr += 8)
3493     {
3494       unsigned int name_offset, file_offset;
3495
3496       file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3497       if (file_offset == 0)
3498         continue;
3499       name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3500       symdef_ptr->s.name = stringbase + name_offset;
3501       symdef_ptr->file_offset = file_offset;
3502       ++symdef_ptr;
3503     }
3504
3505   ardata->first_file_filepos = bfd_tell (abfd);
3506   /* Pad to an even boundary.  */
3507   ardata->first_file_filepos += ardata->first_file_filepos % 2;
3508
3509   bfd_has_map (abfd) = true;
3510
3511   return true;
3512 }
3513
3514 /* Write out an armap.  */
3515
3516 boolean
3517 _bfd_ecoff_write_armap (abfd, elength, map, orl_count, stridx)
3518      bfd *abfd;
3519      unsigned int elength;
3520      struct orl *map;
3521      unsigned int orl_count;
3522      int stridx;
3523 {
3524   unsigned int hashsize, hashlog;
3525   unsigned int symdefsize;
3526   int padit;
3527   unsigned int stringsize;
3528   unsigned int mapsize;
3529   file_ptr firstreal;
3530   struct ar_hdr hdr;
3531   struct stat statbuf;
3532   unsigned int i;
3533   bfd_byte temp[4];
3534   bfd_byte *hashtable;
3535   bfd *current;
3536   bfd *last_elt;
3537
3538   /* Ultrix appears to use as a hash table size the least power of two
3539      greater than twice the number of entries.  */
3540   for (hashlog = 0; (1 << hashlog) <= 2 * orl_count; hashlog++)
3541     ;
3542   hashsize = 1 << hashlog;
3543
3544   symdefsize = hashsize * 8;
3545   padit = stridx % 2;
3546   stringsize = stridx + padit;
3547
3548   /* Include 8 bytes to store symdefsize and stringsize in output. */
3549   mapsize = symdefsize + stringsize + 8;
3550
3551   firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3552
3553   memset ((PTR) &hdr, 0, sizeof hdr);
3554
3555   /* Work out the ECOFF armap name.  */
3556   strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3557   hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3558   hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3559     (abfd->xvec->header_byteorder_big_p
3560      ? ARMAP_BIG_ENDIAN
3561      : ARMAP_LITTLE_ENDIAN);
3562   hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3563   hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3564     abfd->xvec->byteorder_big_p ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3565   memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3566
3567   /* Write the timestamp of the archive header to be just a little bit
3568      later than the timestamp of the file, otherwise the linker will
3569      complain that the index is out of date.  Actually, the Ultrix
3570      linker just checks the archive name; the GNU linker may check the
3571      date.  */
3572   stat (abfd->filename, &statbuf);
3573   sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
3574
3575   /* The DECstation uses zeroes for the uid, gid and mode of the
3576      armap.  */
3577   hdr.ar_uid[0] = '0';
3578   hdr.ar_gid[0] = '0';
3579   hdr.ar_mode[0] = '0';
3580
3581   sprintf (hdr.ar_size, "%-10d", (int) mapsize);
3582
3583   hdr.ar_fmag[0] = '`';
3584   hdr.ar_fmag[1] = '\012';
3585
3586   /* Turn all null bytes in the header into spaces.  */
3587   for (i = 0; i < sizeof (struct ar_hdr); i++)
3588    if (((char *)(&hdr))[i] == '\0')
3589      (((char *)(&hdr))[i]) = ' ';
3590
3591   if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
3592       != sizeof (struct ar_hdr))
3593     return false;
3594
3595   bfd_h_put_32 (abfd, (bfd_vma) hashsize, temp);
3596   if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3597     return false;
3598   
3599   hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3600   if (!hashtable)
3601     {
3602       bfd_set_error (bfd_error_no_memory);
3603       return false;
3604     }
3605
3606   current = abfd->archive_head;
3607   last_elt = current;
3608   for (i = 0; i < orl_count; i++)
3609     {
3610       unsigned int hash, rehash;
3611
3612       /* Advance firstreal to the file position of this archive
3613          element.  */
3614       if (((bfd *) map[i].pos) != last_elt)
3615         {
3616           do
3617             {
3618               firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3619               firstreal += firstreal % 2;
3620               current = current->next;
3621             }
3622           while (current != (bfd *) map[i].pos);
3623         }
3624
3625       last_elt = current;
3626
3627       hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3628       if (bfd_h_get_32 (abfd, (PTR) (hashtable + (hash * 8) + 4)) != 0)
3629         {
3630           unsigned int srch;
3631
3632           /* The desired slot is already taken.  */
3633           for (srch = (hash + rehash) & (hashsize - 1);
3634                srch != hash;
3635                srch = (srch + rehash) & (hashsize - 1))
3636             if (bfd_h_get_32 (abfd, (PTR) (hashtable + (srch * 8) + 4)) == 0)
3637               break;
3638
3639           BFD_ASSERT (srch != hash);
3640
3641           hash = srch;
3642         }
3643         
3644       bfd_h_put_32 (abfd, (bfd_vma) map[i].namidx,
3645                     (PTR) (hashtable + hash * 8));
3646       bfd_h_put_32 (abfd, (bfd_vma) firstreal,
3647                     (PTR) (hashtable + hash * 8 + 4));
3648     }
3649
3650   if (bfd_write ((PTR) hashtable, 1, symdefsize, abfd) != symdefsize)
3651     return false;
3652
3653   bfd_release (abfd, hashtable);
3654
3655   /* Now write the strings.  */
3656   bfd_h_put_32 (abfd, (bfd_vma) stringsize, temp);
3657   if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3658     return false;
3659   for (i = 0; i < orl_count; i++)
3660     {
3661       bfd_size_type len;
3662
3663       len = strlen (*map[i].name) + 1;
3664       if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
3665         return false;
3666     }
3667
3668   /* The spec sez this should be a newline.  But in order to be
3669      bug-compatible for DECstation ar we use a null.  */
3670   if (padit)
3671     {
3672       if (bfd_write ("", 1, 1, abfd) != 1)
3673         return false;
3674     }
3675
3676   return true;
3677 }
3678
3679 /* See whether this BFD is an archive.  If it is, read in the armap
3680    and the extended name table.  */
3681
3682 const bfd_target *
3683 _bfd_ecoff_archive_p (abfd)
3684      bfd *abfd;
3685 {
3686   char armag[SARMAG + 1];
3687
3688   if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG
3689       || strncmp (armag, ARMAG, SARMAG) != 0)
3690     {
3691       if (bfd_get_error () != bfd_error_system_call)
3692         bfd_set_error (bfd_error_wrong_format);
3693       return (const bfd_target *) NULL;
3694     }
3695
3696   /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3697      involves a cast, we can't do it as the left operand of
3698      assignment.  */
3699   abfd->tdata.aout_ar_data =
3700     (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
3701
3702   if (bfd_ardata (abfd) == (struct artdata *) NULL)
3703     {
3704       bfd_set_error (bfd_error_no_memory);
3705       return (const bfd_target *) NULL;
3706     }
3707
3708   bfd_ardata (abfd)->first_file_filepos = SARMAG;
3709   bfd_ardata (abfd)->cache = NULL;
3710   bfd_ardata (abfd)->archive_head = NULL;
3711   bfd_ardata (abfd)->symdefs = NULL;
3712   bfd_ardata (abfd)->extended_names = NULL;
3713   bfd_ardata (abfd)->tdata = NULL;
3714   
3715   if (_bfd_ecoff_slurp_armap (abfd) == false
3716       || _bfd_ecoff_slurp_extended_name_table (abfd) == false)
3717     {
3718       bfd_release (abfd, bfd_ardata (abfd));
3719       abfd->tdata.aout_ar_data = (struct artdata *) NULL;
3720       return (const bfd_target *) NULL;
3721     }
3722   
3723   return abfd->xvec;
3724 }
3725 \f
3726 /* ECOFF linker code.  */
3727
3728 static struct bfd_hash_entry *ecoff_link_hash_newfunc
3729   PARAMS ((struct bfd_hash_entry *entry,
3730            struct bfd_hash_table *table,
3731            const char *string));
3732 static boolean ecoff_link_add_archive_symbols
3733   PARAMS ((bfd *, struct bfd_link_info *));
3734 static boolean ecoff_link_check_archive_element
3735   PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
3736 static boolean ecoff_link_add_object_symbols
3737   PARAMS ((bfd *, struct bfd_link_info *));
3738 static boolean ecoff_link_add_externals
3739   PARAMS ((bfd *, struct bfd_link_info *, PTR, char *));
3740
3741 /* Routine to create an entry in an ECOFF link hash table.  */
3742
3743 static struct bfd_hash_entry *
3744 ecoff_link_hash_newfunc (entry, table, string)
3745      struct bfd_hash_entry *entry;
3746      struct bfd_hash_table *table;
3747      const char *string;
3748 {
3749   struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3750
3751   /* Allocate the structure if it has not already been allocated by a
3752      subclass.  */
3753   if (ret == (struct ecoff_link_hash_entry *) NULL)
3754     ret = ((struct ecoff_link_hash_entry *)
3755            bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3756   if (ret == (struct ecoff_link_hash_entry *) NULL)
3757     {
3758       bfd_set_error (bfd_error_no_memory);
3759       return NULL;
3760     }
3761
3762   /* Call the allocation method of the superclass.  */
3763   ret = ((struct ecoff_link_hash_entry *)
3764          _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3765                                  table, string));
3766
3767   if (ret)
3768     {
3769       /* Set local fields.  */
3770       ret->indx = -1;
3771       ret->abfd = NULL;
3772       ret->written = 0;
3773       ret->small = 0;
3774     }
3775   memset ((PTR) &ret->esym, 0, sizeof ret->esym);
3776
3777   return (struct bfd_hash_entry *) ret;
3778 }
3779
3780 /* Create an ECOFF link hash table.  */
3781
3782 struct bfd_link_hash_table *
3783 _bfd_ecoff_bfd_link_hash_table_create (abfd)
3784      bfd *abfd;
3785 {
3786   struct ecoff_link_hash_table *ret;
3787
3788   ret = ((struct ecoff_link_hash_table *)
3789          malloc (sizeof (struct ecoff_link_hash_table)));
3790   if (!ret)
3791       {
3792         bfd_set_error (bfd_error_no_memory);
3793         return NULL;
3794       }
3795   if (! _bfd_link_hash_table_init (&ret->root, abfd,
3796                                    ecoff_link_hash_newfunc))
3797     {
3798       free (ret);
3799       return (struct bfd_link_hash_table *) NULL;
3800     }
3801   return &ret->root;
3802 }
3803
3804 /* Look up an entry in an ECOFF link hash table.  */
3805
3806 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3807   ((struct ecoff_link_hash_entry *) \
3808    bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3809
3810 /* Traverse an ECOFF link hash table.  */
3811
3812 #define ecoff_link_hash_traverse(table, func, info)                     \
3813   (bfd_link_hash_traverse                                               \
3814    (&(table)->root,                                                     \
3815     (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func),  \
3816     (info)))
3817
3818 /* Get the ECOFF link hash table from the info structure.  This is
3819    just a cast.  */
3820
3821 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3822
3823 /* Given an ECOFF BFD, add symbols to the global hash table as
3824    appropriate.  */
3825
3826 boolean
3827 _bfd_ecoff_bfd_link_add_symbols (abfd, info)
3828      bfd *abfd;
3829      struct bfd_link_info *info;
3830 {
3831   switch (bfd_get_format (abfd))
3832     {
3833     case bfd_object:
3834       return ecoff_link_add_object_symbols (abfd, info);
3835     case bfd_archive:
3836       return ecoff_link_add_archive_symbols (abfd, info);
3837     default:
3838       bfd_set_error (bfd_error_wrong_format);
3839       return false;
3840     }
3841 }
3842
3843 /* Add the symbols from an archive file to the global hash table.
3844    This looks through the undefined symbols, looks each one up in the
3845    archive hash table, and adds any associated object file.  We do not
3846    use _bfd_generic_link_add_archive_symbols because ECOFF archives
3847    already have a hash table, so there is no reason to construct
3848    another one.  */
3849
3850 static boolean
3851 ecoff_link_add_archive_symbols (abfd, info)
3852      bfd *abfd;
3853      struct bfd_link_info *info;
3854 {
3855   const bfd_byte *raw_armap;
3856   struct bfd_link_hash_entry **pundef;
3857   unsigned int armap_count;
3858   unsigned int armap_log;
3859   unsigned int i;
3860   const bfd_byte *hashtable;
3861   const char *stringbase;
3862
3863   if (! bfd_has_map (abfd))
3864     {
3865       /* An empty archive is a special case.  */
3866       if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL)
3867         return true;
3868       bfd_set_error (bfd_error_no_symbols);
3869       return false;
3870     }
3871
3872   /* If we don't have any raw data for this archive, as can happen on
3873      Irix 4.0.5F, we call the generic routine.
3874      FIXME: We should be more clever about this, since someday tdata
3875      may get to something for a generic archive.  */
3876   raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3877   if (raw_armap == (bfd_byte *) NULL)
3878     return (_bfd_generic_link_add_archive_symbols
3879             (abfd, info, ecoff_link_check_archive_element));
3880
3881   armap_count = bfd_h_get_32 (abfd, raw_armap);
3882
3883   armap_log = 0;
3884   for (i = 1; i < armap_count; i <<= 1)
3885     armap_log++;
3886   BFD_ASSERT (i == armap_count);
3887
3888   hashtable = raw_armap + 4;
3889   stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3890
3891   /* Look through the list of undefined symbols.  */
3892   pundef = &info->hash->undefs;
3893   while (*pundef != (struct bfd_link_hash_entry *) NULL)
3894     {
3895       struct bfd_link_hash_entry *h;
3896       unsigned int hash, rehash;
3897       unsigned int file_offset;
3898       const char *name;
3899       bfd *element;
3900
3901       h = *pundef;
3902
3903       /* When a symbol is defined, it is not necessarily removed from
3904          the list.  */
3905       if (h->type != bfd_link_hash_undefined
3906           && h->type != bfd_link_hash_common)
3907         {
3908           /* Remove this entry from the list, for general cleanliness
3909              and because we are going to look through the list again
3910              if we search any more libraries.  We can't remove the
3911              entry if it is the tail, because that would lose any
3912              entries we add to the list later on.  */
3913           if (*pundef != info->hash->undefs_tail)
3914             *pundef = (*pundef)->next;
3915           else
3916             pundef = &(*pundef)->next;
3917           continue;
3918         }
3919
3920       /* Native ECOFF linkers do not pull in archive elements merely
3921          to satisfy common definitions, so neither do we.  We leave
3922          them on the list, though, in case we are linking against some
3923          other object format.  */
3924       if (h->type != bfd_link_hash_undefined)
3925         {
3926           pundef = &(*pundef)->next;
3927           continue;
3928         }
3929
3930       /* Look for this symbol in the archive hash table.  */
3931       hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3932                                armap_log);
3933
3934       file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4);
3935       if (file_offset == 0)
3936         {
3937           /* Nothing in this slot.  */
3938           pundef = &(*pundef)->next;
3939           continue;
3940         }
3941
3942       name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8));
3943       if (name[0] != h->root.string[0]
3944           || strcmp (name, h->root.string) != 0)
3945         {
3946           unsigned int srch;
3947           boolean found;
3948
3949           /* That was the wrong symbol.  Try rehashing.  */
3950           found = false;
3951           for (srch = (hash + rehash) & (armap_count - 1);
3952                srch != hash;
3953                srch = (srch + rehash) & (armap_count - 1))
3954             {
3955               file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4);
3956               if (file_offset == 0)
3957                 break;
3958               name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8));
3959               if (name[0] == h->root.string[0]
3960                   && strcmp (name, h->root.string) == 0)
3961                 {
3962                   found = true;
3963                   break;
3964                 }
3965             }
3966
3967           if (! found)
3968             {
3969               pundef = &(*pundef)->next;
3970               continue;
3971             }
3972
3973           hash = srch;
3974         }
3975
3976       element = _bfd_get_elt_at_filepos (abfd, file_offset);
3977       if (element == (bfd *) NULL)
3978         return false;
3979
3980       if (! bfd_check_format (element, bfd_object))
3981         return false;
3982
3983       /* Unlike the generic linker, we know that this element provides
3984          a definition for an undefined symbol and we know that we want
3985          to include it.  We don't need to check anything.  */
3986       if (! (*info->callbacks->add_archive_element) (info, element, name))
3987         return false;
3988       if (! ecoff_link_add_object_symbols (element, info))
3989         return false;
3990
3991       pundef = &(*pundef)->next;
3992     }
3993
3994   return true;
3995 }
3996
3997 /* This is called if we used _bfd_generic_link_add_archive_symbols
3998    because we were not dealing with an ECOFF archive.  */
3999
4000 static boolean
4001 ecoff_link_check_archive_element (abfd, info, pneeded)
4002      bfd *abfd;
4003      struct bfd_link_info *info;
4004      boolean *pneeded;
4005 {
4006   const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4007   void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
4008     = backend->debug_swap.swap_ext_in;
4009   HDRR *symhdr;
4010   bfd_size_type external_ext_size;
4011   PTR external_ext = NULL;
4012   size_t esize;
4013   char *ssext = NULL;
4014   char *ext_ptr;
4015   char *ext_end;
4016
4017   *pneeded = false;
4018
4019   if (! ecoff_slurp_symbolic_header (abfd))
4020     goto error_return;
4021
4022   /* If there are no symbols, we don't want it.  */
4023   if (bfd_get_symcount (abfd) == 0)
4024     goto successful_return;
4025
4026   symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
4027
4028   /* Read in the external symbols and external strings.  */
4029   external_ext_size = backend->debug_swap.external_ext_size;
4030   esize = symhdr->iextMax * external_ext_size;
4031   external_ext = (PTR) malloc (esize);
4032   if (external_ext == NULL && esize != 0)
4033     {
4034       bfd_set_error (bfd_error_no_memory);
4035       goto error_return;
4036     }
4037
4038   if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
4039       || bfd_read (external_ext, 1, esize, abfd) != esize)
4040     goto error_return;
4041
4042   ssext = (char *) malloc (symhdr->issExtMax);
4043   if (ssext == NULL && symhdr->issExtMax != 0)
4044     {
4045       bfd_set_error (bfd_error_no_memory);
4046       goto error_return;
4047     }
4048
4049   if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
4050       || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
4051     goto error_return;
4052
4053   /* Look through the external symbols to see if they define some
4054      symbol that is currently undefined.  */
4055   ext_ptr = (char *) external_ext;
4056   ext_end = ext_ptr + esize;
4057   for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
4058     {
4059       EXTR esym;
4060       boolean def;
4061       const char *name;
4062       struct bfd_link_hash_entry *h;
4063
4064       (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
4065
4066       /* See if this symbol defines something.  */
4067       if (esym.asym.st != stGlobal
4068           && esym.asym.st != stLabel
4069           && esym.asym.st != stProc)
4070         continue;
4071
4072       switch (esym.asym.sc)
4073         {
4074         case scText:
4075         case scData:
4076         case scBss:
4077         case scAbs:
4078         case scSData:
4079         case scSBss:
4080         case scRData:
4081         case scCommon:
4082         case scSCommon:
4083         case scInit:
4084         case scFini:
4085           def = true;
4086           break;
4087         default:
4088           def = false;
4089           break;
4090         }
4091
4092       if (! def)
4093         continue;
4094
4095       name = ssext + esym.asym.iss;
4096       h = bfd_link_hash_lookup (info->hash, name, false, false, true);
4097
4098       /* Unlike the generic linker, we do not pull in elements because
4099          of common symbols.  */
4100       if (h == (struct bfd_link_hash_entry *) NULL
4101           || h->type != bfd_link_hash_undefined)
4102         continue;
4103
4104       /* Include this element.  */
4105       if (! (*info->callbacks->add_archive_element) (info, abfd, name))
4106         goto error_return;
4107       if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
4108         goto error_return;
4109
4110       *pneeded = true;
4111       goto successful_return;
4112     }
4113
4114  successful_return:
4115   if (external_ext != NULL)
4116     free (external_ext);
4117   if (ssext != NULL)
4118     free (ssext);
4119   return true;
4120  error_return:
4121   if (external_ext != NULL)
4122     free (external_ext);
4123   if (ssext != NULL)
4124     free (ssext);
4125   return false;
4126 }
4127
4128 /* Add symbols from an ECOFF object file to the global linker hash
4129    table.  */
4130
4131 static boolean
4132 ecoff_link_add_object_symbols (abfd, info)
4133      bfd *abfd;
4134      struct bfd_link_info *info;
4135 {
4136   HDRR *symhdr;
4137   bfd_size_type external_ext_size;
4138   PTR external_ext = NULL;
4139   size_t esize;
4140   char *ssext = NULL;
4141   boolean result;
4142
4143   if (! ecoff_slurp_symbolic_header (abfd))
4144     return false;
4145
4146   /* If there are no symbols, we don't want it.  */
4147   if (bfd_get_symcount (abfd) == 0)
4148     return true;
4149
4150   symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
4151
4152   /* Read in the external symbols and external strings.  */
4153   external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
4154   esize = symhdr->iextMax * external_ext_size;
4155   external_ext = (PTR) malloc (esize);
4156   if (external_ext == NULL && esize != 0)
4157     {
4158       bfd_set_error (bfd_error_no_memory);
4159       goto error_return;
4160     }
4161
4162   if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
4163       || bfd_read (external_ext, 1, esize, abfd) != esize)
4164     goto error_return;
4165
4166   ssext = (char *) malloc (symhdr->issExtMax);
4167   if (ssext == NULL && symhdr->issExtMax != 0)
4168     {
4169       bfd_set_error (bfd_error_no_memory);
4170       goto error_return;
4171     }
4172
4173   if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
4174       || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
4175     goto error_return;
4176
4177   result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
4178
4179   if (ssext != NULL)
4180     free (ssext);
4181   if (external_ext != NULL)
4182     free (external_ext);
4183   return result;
4184
4185  error_return:
4186   if (ssext != NULL)
4187     free (ssext);
4188   if (external_ext != NULL)
4189     free (external_ext);
4190   return false;
4191 }
4192
4193 /* Add the external symbols of an object file to the global linker
4194    hash table.  The external symbols and strings we are passed are
4195    just allocated on the stack, and will be discarded.  We must
4196    explicitly save any information we may need later on in the link.
4197    We do not want to read the external symbol information again.  */
4198
4199 static boolean
4200 ecoff_link_add_externals (abfd, info, external_ext, ssext)
4201      bfd *abfd;
4202      struct bfd_link_info *info;
4203      PTR external_ext;
4204      char *ssext;
4205 {
4206   const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4207   void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
4208     = backend->debug_swap.swap_ext_in;
4209   bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
4210   unsigned long ext_count;
4211   struct ecoff_link_hash_entry **sym_hash;
4212   char *ext_ptr;
4213   char *ext_end;
4214
4215   ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
4216
4217   sym_hash = ((struct ecoff_link_hash_entry **)
4218               bfd_alloc (abfd,
4219                          ext_count * sizeof (struct bfd_link_hash_entry *)));
4220   if (!sym_hash)
4221     {
4222       bfd_set_error (bfd_error_no_memory);
4223       return false;
4224     }
4225   ecoff_data (abfd)->sym_hashes = sym_hash;
4226
4227   ext_ptr = (char *) external_ext;
4228   ext_end = ext_ptr + ext_count * external_ext_size;
4229   for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
4230     {
4231       EXTR esym;
4232       boolean skip;
4233       bfd_vma value;
4234       asection *section;
4235       const char *name;
4236       struct ecoff_link_hash_entry *h;
4237
4238       *sym_hash = NULL;
4239
4240       (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
4241
4242       /* Skip debugging symbols.  */
4243       skip = false;
4244       switch (esym.asym.st)
4245         {
4246         case stGlobal:
4247         case stStatic:
4248         case stLabel:
4249         case stProc:
4250         case stStaticProc:
4251           break;
4252         default:
4253           skip = true;
4254           break;
4255         }
4256
4257       if (skip)
4258         continue;
4259
4260       /* Get the information for this symbol.  */
4261       value = esym.asym.value;
4262       switch (esym.asym.sc)
4263         {
4264         default:
4265         case scNil:
4266         case scRegister:
4267         case scCdbLocal:
4268         case scBits:
4269         case scCdbSystem:
4270         case scRegImage:
4271         case scInfo:
4272         case scUserStruct:
4273         case scVar:
4274         case scVarRegister:
4275         case scVariant:
4276         case scBasedVar:
4277         case scXData:
4278         case scPData:
4279           section = NULL;
4280           break;
4281         case scText:
4282           section = bfd_make_section_old_way (abfd, ".text");
4283           value -= section->vma;
4284           break;
4285         case scData:
4286           section = bfd_make_section_old_way (abfd, ".data");
4287           value -= section->vma;
4288           break;
4289         case scBss:
4290           section = bfd_make_section_old_way (abfd, ".bss");
4291           value -= section->vma;
4292           break;
4293         case scAbs:
4294           section = bfd_abs_section_ptr;
4295           break;
4296         case scUndefined:
4297           section = bfd_und_section_ptr;
4298           break;
4299         case scSData:
4300           section = bfd_make_section_old_way (abfd, ".sdata");
4301           value -= section->vma;
4302           break;
4303         case scSBss:
4304           section = bfd_make_section_old_way (abfd, ".sbss");
4305           value -= section->vma;
4306           break;
4307         case scRData:
4308           section = bfd_make_section_old_way (abfd, ".rdata");
4309           value -= section->vma;
4310           break;
4311         case scCommon:
4312           if (value > ecoff_data (abfd)->gp_size)
4313             {
4314               section = bfd_com_section_ptr;
4315               break;
4316             }
4317           /* Fall through.  */
4318         case scSCommon:
4319           if (ecoff_scom_section.name == NULL)
4320             {
4321               /* Initialize the small common section.  */
4322               ecoff_scom_section.name = SCOMMON;
4323               ecoff_scom_section.flags = SEC_IS_COMMON;
4324               ecoff_scom_section.output_section = &ecoff_scom_section;
4325               ecoff_scom_section.symbol = &ecoff_scom_symbol;
4326               ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
4327               ecoff_scom_symbol.name = SCOMMON;
4328               ecoff_scom_symbol.flags = BSF_SECTION_SYM;
4329               ecoff_scom_symbol.section = &ecoff_scom_section;
4330               ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
4331             }
4332           section = &ecoff_scom_section;
4333           break;
4334         case scSUndefined:
4335           section = bfd_und_section_ptr;
4336           break;
4337         case scInit:
4338           section = bfd_make_section_old_way (abfd, ".init");
4339           value -= section->vma;
4340           break;
4341         case scFini:
4342           section = bfd_make_section_old_way (abfd, ".fini");
4343           value -= section->vma;
4344           break;
4345         }
4346
4347       if (section == (asection *) NULL)
4348         continue;
4349
4350       name = ssext + esym.asym.iss;
4351
4352       h = NULL;
4353       if (! (_bfd_generic_link_add_one_symbol
4354              (info, abfd, name, BSF_GLOBAL, section, value,
4355               (const char *) NULL, true, true,
4356               (struct bfd_link_hash_entry **) &h)))
4357         return false;
4358
4359       *sym_hash = h;
4360
4361       /* If we are building an ECOFF hash table, save the external
4362          symbol information.  */
4363       if (info->hash->creator->flavour == bfd_get_flavour (abfd))
4364         {
4365           if (h->abfd == (bfd *) NULL
4366               || (! bfd_is_und_section (section)
4367                   && (! bfd_is_com_section (section)
4368                       || (h->root.type != bfd_link_hash_defined
4369                           && h->root.type != bfd_link_hash_defweak))))
4370             {
4371               h->abfd = abfd;
4372               h->esym = esym;
4373             }
4374
4375           /* Remember whether this symbol was small undefined.  */
4376           if (esym.asym.sc == scSUndefined)
4377             h->small = 1;
4378
4379           /* If this symbol was ever small undefined, it needs to wind
4380              up in a GP relative section.  We can't control the
4381              section of a defined symbol, but we can control the
4382              section of a common symbol.  This case is actually needed
4383              on Ultrix 4.2 to handle the symbol cred in -lckrb.  */
4384           if (h->small
4385               && h->root.type == bfd_link_hash_common
4386               && strcmp (h->root.u.c.section->name, SCOMMON) != 0)
4387             {
4388               h->root.u.c.section = bfd_make_section_old_way (abfd, SCOMMON);
4389               h->root.u.c.section->flags = SEC_ALLOC;
4390               if (h->esym.asym.sc == scCommon)
4391                 h->esym.asym.sc = scSCommon;
4392             }
4393         }
4394     }
4395
4396   return true;
4397 }
4398 \f
4399 /* ECOFF final link routines.  */
4400
4401 static boolean ecoff_final_link_debug_accumulate
4402   PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *,
4403            PTR handle));
4404 static boolean ecoff_link_write_external
4405   PARAMS ((struct ecoff_link_hash_entry *, PTR));
4406 static boolean ecoff_indirect_link_order
4407   PARAMS ((bfd *, struct bfd_link_info *, asection *,
4408            struct bfd_link_order *));
4409 static boolean ecoff_reloc_link_order
4410   PARAMS ((bfd *, struct bfd_link_info *, asection *,
4411            struct bfd_link_order *));
4412
4413 /* ECOFF final link routine.  This looks through all the input BFDs
4414    and gathers together all the debugging information, and then
4415    processes all the link order information.  This may cause it to
4416    close and reopen some input BFDs; I'll see how bad this is.  */
4417
4418 boolean
4419 _bfd_ecoff_bfd_final_link (abfd, info)
4420      bfd *abfd;
4421      struct bfd_link_info *info;
4422 {
4423   const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4424   struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4425   HDRR *symhdr;
4426   PTR handle;
4427   register bfd *input_bfd;
4428   asection *o;
4429   struct bfd_link_order *p;
4430
4431   /* We accumulate the debugging information counts in the symbolic
4432      header.  */
4433   symhdr = &debug->symbolic_header;
4434   symhdr->vstamp = 0;
4435   symhdr->ilineMax = 0;
4436   symhdr->cbLine = 0;
4437   symhdr->idnMax = 0;
4438   symhdr->ipdMax = 0;
4439   symhdr->isymMax = 0;
4440   symhdr->ioptMax = 0;
4441   symhdr->iauxMax = 0;
4442   symhdr->issMax = 0;
4443   symhdr->issExtMax = 0;
4444   symhdr->ifdMax = 0;
4445   symhdr->crfd = 0;
4446   symhdr->iextMax = 0;
4447
4448   /* We accumulate the debugging information itself in the debug_info
4449      structure.  */
4450   debug->line = NULL;
4451   debug->external_dnr = NULL;
4452   debug->external_pdr = NULL;
4453   debug->external_sym = NULL;
4454   debug->external_opt = NULL;
4455   debug->external_aux = NULL;
4456   debug->ss = NULL;
4457   debug->ssext = debug->ssext_end = NULL;
4458   debug->external_fdr = NULL;
4459   debug->external_rfd = NULL;
4460   debug->external_ext = debug->external_ext_end = NULL;
4461
4462   handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4463   if (handle == (PTR) NULL)
4464     return false;
4465
4466   /* Accumulate the debugging symbols from each input BFD.  */
4467   for (input_bfd = info->input_bfds;
4468        input_bfd != (bfd *) NULL;
4469        input_bfd = input_bfd->link_next)
4470     {
4471       boolean ret;
4472
4473       if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4474         {
4475           /* Abitrarily set the symbolic header vstamp to the vstamp
4476              of the first object file in the link.  */
4477           if (symhdr->vstamp == 0)
4478             symhdr->vstamp
4479               = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4480           ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4481                                                    handle);
4482         }
4483       else
4484         ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4485                                                 debug, &backend->debug_swap,
4486                                                 input_bfd, info);
4487       if (! ret)
4488         return false;
4489
4490       /* Combine the register masks.  */
4491       ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4492       ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4493       ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4494       ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4495       ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4496       ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4497     }
4498
4499   /* Write out the external symbols.  */
4500   ecoff_link_hash_traverse (ecoff_hash_table (info),
4501                             ecoff_link_write_external,
4502                             (PTR) abfd);
4503
4504   if (info->relocateable)
4505     {
4506       /* We need to make a pass over the link_orders to count up the
4507          number of relocations we will need to output, so that we know
4508          how much space they will take up.  */
4509       for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4510         {
4511           o->reloc_count = 0;
4512           for (p = o->link_order_head;
4513                p != (struct bfd_link_order *) NULL;
4514                p = p->next)
4515             if (p->type == bfd_indirect_link_order)
4516               o->reloc_count += p->u.indirect.section->reloc_count;
4517             else if (p->type == bfd_section_reloc_link_order
4518                      || p->type == bfd_symbol_reloc_link_order)
4519               ++o->reloc_count;
4520         }
4521     }
4522
4523   /* Compute the reloc and symbol file positions.  */
4524   ecoff_compute_reloc_file_positions (abfd);
4525
4526   /* Write out the debugging information.  */
4527   if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4528                                            &backend->debug_swap, info,
4529                                            ecoff_data (abfd)->sym_filepos))
4530     return false;
4531
4532   bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4533
4534   if (info->relocateable)
4535     {
4536       /* Now reset the reloc_count field of the sections in the output
4537          BFD to 0, so that we can use them to keep track of how many
4538          relocs we have output thus far.  */
4539       for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4540         o->reloc_count = 0;
4541     }
4542
4543   /* Get a value for the GP register.  */
4544   if (ecoff_data (abfd)->gp == 0)
4545     {
4546       struct bfd_link_hash_entry *h;
4547
4548       h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4549       if (h != (struct bfd_link_hash_entry *) NULL
4550           && h->type == bfd_link_hash_defined)
4551         ecoff_data (abfd)->gp = (h->u.def.value
4552                                  + h->u.def.section->output_section->vma
4553                                  + h->u.def.section->output_offset);
4554       else if (info->relocateable)
4555         {
4556           bfd_vma lo;
4557
4558           /* Make up a value.  */
4559           lo = (bfd_vma) -1;
4560           for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4561             {
4562               if (o->vma < lo
4563                   && (strcmp (o->name, _SBSS) == 0
4564                       || strcmp (o->name, _SDATA) == 0
4565                       || strcmp (o->name, _LIT4) == 0
4566                       || strcmp (o->name, _LIT8) == 0
4567                       || strcmp (o->name, _LITA) == 0))
4568                 lo = o->vma;
4569             }
4570           ecoff_data (abfd)->gp = lo + 0x8000;
4571         }
4572       else
4573         {
4574           /* If the relocate_section function needs to do a reloc
4575              involving the GP value, it should make a reloc_dangerous
4576              callback to warn that GP is not defined.  */
4577         }
4578     }
4579
4580   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4581     {
4582       for (p = o->link_order_head;
4583            p != (struct bfd_link_order *) NULL;
4584            p = p->next)
4585         {
4586           if (p->type == bfd_indirect_link_order
4587               && (bfd_get_flavour (p->u.indirect.section->owner)
4588                   == bfd_target_ecoff_flavour))
4589             {
4590               if (! ecoff_indirect_link_order (abfd, info, o, p))
4591                 return false;
4592             }
4593           else if (p->type == bfd_section_reloc_link_order
4594                    || p->type == bfd_symbol_reloc_link_order)
4595             {
4596               if (! ecoff_reloc_link_order (abfd, info, o, p))
4597                 return false;
4598             }
4599           else
4600             {
4601               if (! _bfd_default_link_order (abfd, info, o, p))
4602                 return false;
4603             }
4604         }
4605     }
4606
4607   bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4608
4609   ecoff_data (abfd)->linker = true;
4610
4611   return true;
4612 }
4613
4614 /* Accumulate the debugging information for an input BFD into the
4615    output BFD.  This must read in the symbolic information of the
4616    input BFD.  */
4617
4618 static boolean
4619 ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
4620      bfd *output_bfd;
4621      bfd *input_bfd;
4622      struct bfd_link_info *info;
4623      PTR handle;
4624 {
4625   struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
4626   const struct ecoff_debug_swap * const swap =
4627     &ecoff_backend (input_bfd)->debug_swap;
4628   HDRR *symhdr = &debug->symbolic_header;
4629   boolean ret;
4630
4631 #define READ(ptr, offset, count, size, type)                            \
4632   if (symhdr->count == 0)                                               \
4633     debug->ptr = NULL;                                                  \
4634   else                                                                  \
4635     {                                                                   \
4636       debug->ptr = (type) malloc (size * symhdr->count);                \
4637       if (debug->ptr == NULL)                                           \
4638         {                                                               \
4639           bfd_set_error (bfd_error_no_memory);                          \
4640           ret = false;                                                  \
4641           goto return_something;                                        \
4642         }                                                               \
4643       if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET)    \
4644            != 0)                                                        \
4645           || (bfd_read (debug->ptr, size, symhdr->count,                \
4646                         input_bfd) != size * symhdr->count))            \
4647         {                                                               \
4648           ret = false;                                                  \
4649           goto return_something;                                        \
4650         }                                                               \
4651     }
4652
4653   /* If raw_syments is not NULL, then the data was already by read by
4654      _bfd_ecoff_slurp_symbolic_info.  */
4655   if (ecoff_data (input_bfd)->raw_syments == NULL)
4656     {
4657       READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
4658             unsigned char *);
4659       READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
4660       READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
4661       READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
4662       READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
4663       READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
4664             union aux_ext *);
4665       READ (ss, cbSsOffset, issMax, sizeof (char), char *);
4666       READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
4667       READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
4668     }
4669 #undef READ
4670
4671   /* We do not read the external strings or the external symbols.  */
4672
4673   ret = (bfd_ecoff_debug_accumulate
4674          (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
4675           &ecoff_backend (output_bfd)->debug_swap,
4676           input_bfd, debug, swap, info));
4677
4678  return_something:
4679   if (ecoff_data (input_bfd)->raw_syments == NULL)
4680     {
4681       if (debug->line != NULL)
4682         free (debug->line);
4683       if (debug->external_dnr != NULL)
4684         free (debug->external_dnr);
4685       if (debug->external_pdr != NULL)
4686         free (debug->external_pdr);
4687       if (debug->external_sym != NULL)
4688         free (debug->external_sym);
4689       if (debug->external_opt != NULL)
4690         free (debug->external_opt);
4691       if (debug->external_aux != NULL)
4692         free (debug->external_aux);
4693       if (debug->ss != NULL)
4694         free (debug->ss);
4695       if (debug->external_fdr != NULL)
4696         free (debug->external_fdr);
4697       if (debug->external_rfd != NULL)
4698         free (debug->external_rfd);
4699
4700       /* Make sure we don't accidentally follow one of these pointers
4701          into freed memory.  */
4702       debug->line = NULL;
4703       debug->external_dnr = NULL;
4704       debug->external_pdr = NULL;
4705       debug->external_sym = NULL;
4706       debug->external_opt = NULL;
4707       debug->external_aux = NULL;
4708       debug->ss = NULL;
4709       debug->external_fdr = NULL;
4710       debug->external_rfd = NULL;
4711     }
4712
4713   return ret;
4714 }
4715
4716 /* Put out information for an external symbol.  These come only from
4717    the hash table.  */
4718
4719 static boolean
4720 ecoff_link_write_external (h, data)
4721      struct ecoff_link_hash_entry *h;
4722      PTR data;
4723 {
4724   bfd *output_bfd = (bfd *) data;
4725
4726   /* FIXME: We should check if this symbol is being stripped.  */
4727
4728   if (h->written)
4729     return true;
4730
4731   if (h->abfd == (bfd *) NULL)
4732     {
4733       h->esym.jmptbl = 0;
4734       h->esym.cobol_main = 0;
4735       h->esym.weakext = 0;
4736       h->esym.reserved = 0;
4737       h->esym.ifd = ifdNil;
4738       h->esym.asym.value = 0;
4739       h->esym.asym.st = stGlobal;
4740
4741       if (h->root.type != bfd_link_hash_defined
4742           && h->root.type != bfd_link_hash_defweak)
4743         h->esym.asym.sc = scAbs;
4744       else
4745         {
4746           asection *output_section;
4747           const char *name;
4748
4749           output_section = h->root.u.def.section->output_section;
4750           name = bfd_section_name (output_section->owner, output_section);
4751         
4752           if (strcmp (name, _TEXT) == 0)
4753             h->esym.asym.sc = scText;
4754           else if (strcmp (name, _DATA) == 0)
4755             h->esym.asym.sc = scData;
4756           else if (strcmp (name, _SDATA) == 0)
4757             h->esym.asym.sc = scSData;
4758           else if (strcmp (name, _RDATA) == 0)
4759             h->esym.asym.sc = scRData;
4760           else if (strcmp (name, _BSS) == 0)
4761             h->esym.asym.sc = scBss;
4762           else if (strcmp (name, _SBSS) == 0)
4763             h->esym.asym.sc = scSBss;
4764           else if (strcmp (name, _INIT) == 0)
4765             h->esym.asym.sc = scInit;
4766           else if (strcmp (name, _FINI) == 0)
4767             h->esym.asym.sc = scFini;
4768           else if (strcmp (name, _PDATA) == 0)
4769             h->esym.asym.sc = scPData;
4770           else if (strcmp (name, _XDATA) == 0)
4771             h->esym.asym.sc = scXData;
4772           else
4773             h->esym.asym.sc = scAbs;
4774         }
4775
4776       h->esym.asym.reserved = 0;
4777       h->esym.asym.index = indexNil;
4778     }
4779   else if (h->esym.ifd != -1)
4780     {
4781       struct ecoff_debug_info *debug;
4782
4783       /* Adjust the FDR index for the symbol by that used for the
4784          input BFD.  */
4785       debug = &ecoff_data (h->abfd)->debug_info;
4786       BFD_ASSERT (h->esym.ifd >= 0
4787                   && h->esym.ifd < debug->symbolic_header.ifdMax);
4788       h->esym.ifd = debug->ifdmap[h->esym.ifd];
4789     }
4790
4791   switch (h->root.type)
4792     {
4793     default:
4794     case bfd_link_hash_new:
4795       abort ();
4796     case bfd_link_hash_undefined:
4797     case bfd_link_hash_undefweak:
4798       if (h->esym.asym.sc != scUndefined
4799           && h->esym.asym.sc != scSUndefined)
4800         h->esym.asym.sc = scUndefined;
4801       break;
4802     case bfd_link_hash_defined:
4803     case bfd_link_hash_defweak:
4804       if (h->esym.asym.sc == scUndefined
4805           || h->esym.asym.sc == scSUndefined)
4806         h->esym.asym.sc = scAbs;
4807       else if (h->esym.asym.sc == scCommon)
4808         h->esym.asym.sc = scBss;
4809       else if (h->esym.asym.sc == scSCommon)
4810         h->esym.asym.sc = scSBss;
4811       h->esym.asym.value = (h->root.u.def.value
4812                             + h->root.u.def.section->output_section->vma
4813                             + h->root.u.def.section->output_offset);
4814       break;
4815     case bfd_link_hash_common:
4816       if (h->esym.asym.sc != scCommon
4817           && h->esym.asym.sc != scSCommon)
4818         h->esym.asym.sc = scCommon;
4819       h->esym.asym.value = h->root.u.c.size;
4820       break;
4821     case bfd_link_hash_indirect:
4822     case bfd_link_hash_warning:
4823       /* FIXME: Ignore these for now.  The circumstances under which
4824          they should be written out are not clear to me.  */
4825       return true;
4826     }
4827
4828   /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4829      symbol number.  */
4830   h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4831   h->written = 1;
4832
4833   return (bfd_ecoff_debug_one_external
4834           (output_bfd, &ecoff_data (output_bfd)->debug_info,
4835            &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4836            &h->esym));
4837 }
4838
4839 /* Relocate and write an ECOFF section into an ECOFF output file.  */
4840
4841 static boolean
4842 ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
4843      bfd *output_bfd;
4844      struct bfd_link_info *info;
4845      asection *output_section;
4846      struct bfd_link_order *link_order;
4847 {
4848   asection *input_section;
4849   bfd *input_bfd;
4850   struct ecoff_section_tdata *section_tdata;
4851   bfd_size_type raw_size;
4852   bfd_size_type cooked_size;
4853   bfd_byte *contents = NULL;
4854   bfd_size_type external_reloc_size;
4855   bfd_size_type external_relocs_size;
4856   PTR external_relocs = NULL;
4857
4858   BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
4859
4860   if (link_order->size == 0)
4861     return true;
4862
4863   input_section = link_order->u.indirect.section;
4864   input_bfd = input_section->owner;
4865   section_tdata = ecoff_section_data (input_bfd, input_section);
4866
4867   raw_size = input_section->_raw_size;
4868   cooked_size = input_section->_cooked_size;
4869   if (cooked_size == 0)
4870     cooked_size = raw_size;
4871
4872   BFD_ASSERT (input_section->output_section == output_section);
4873   BFD_ASSERT (input_section->output_offset == link_order->offset);
4874   BFD_ASSERT (cooked_size == link_order->size);
4875
4876   /* Get the section contents.  We allocate memory for the larger of
4877      the size before relocating and the size after relocating.  */
4878   contents = (bfd_byte *) malloc (raw_size >= cooked_size
4879                                   ? raw_size
4880                                   : cooked_size);
4881   if (contents == NULL && raw_size != 0)
4882     {
4883       bfd_set_error (bfd_error_no_memory);
4884       goto error_return;
4885     }
4886
4887   /* If we are relaxing, the contents may have already been read into
4888      memory, in which case we copy them into our new buffer.  We don't
4889      simply reuse the old buffer in case cooked_size > raw_size.  */
4890   if (section_tdata != (struct ecoff_section_tdata *) NULL
4891       && section_tdata->contents != (bfd_byte *) NULL)
4892     memcpy (contents, section_tdata->contents, raw_size);
4893   else
4894     {
4895       if (! bfd_get_section_contents (input_bfd, input_section,
4896                                       (PTR) contents,
4897                                       (file_ptr) 0, raw_size))
4898         goto error_return;
4899     }
4900
4901   /* Get the relocs.  If we are relaxing MIPS code, they will already
4902      have been read in.  Otherwise, we read them in now.  */
4903   external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
4904   external_relocs_size = external_reloc_size * input_section->reloc_count;
4905
4906   if (section_tdata != (struct ecoff_section_tdata *) NULL)
4907     external_relocs = section_tdata->external_relocs;
4908   else
4909     {
4910       external_relocs = (PTR) malloc (external_relocs_size);
4911       if (external_relocs == NULL && external_relocs_size != 0)
4912         {
4913           bfd_set_error (bfd_error_no_memory);
4914           goto error_return;
4915         }
4916
4917       if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4918           || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd)
4919               != external_relocs_size))
4920         goto error_return;
4921     }
4922
4923   /* Relocate the section contents.  */
4924   if (! ((*ecoff_backend (input_bfd)->relocate_section)
4925          (output_bfd, info, input_bfd, input_section, contents,
4926           external_relocs)))
4927     goto error_return;
4928
4929   /* Write out the relocated section.  */
4930   if (! bfd_set_section_contents (output_bfd,
4931                                   output_section,
4932                                   (PTR) contents,
4933                                   input_section->output_offset,
4934                                   cooked_size))
4935     goto error_return;
4936
4937   /* If we are producing relocateable output, the relocs were
4938      modified, and we write them out now.  We use the reloc_count
4939      field of output_section to keep track of the number of relocs we
4940      have output so far.  */
4941   if (info->relocateable)
4942     {
4943       if (bfd_seek (output_bfd,
4944                     (output_section->rel_filepos +
4945                      output_section->reloc_count * external_reloc_size),
4946                     SEEK_SET) != 0
4947           || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd)
4948               != external_relocs_size))
4949         goto error_return;
4950       output_section->reloc_count += input_section->reloc_count;
4951     }
4952
4953   if (contents != NULL)
4954     free (contents);
4955   if (external_relocs != NULL && section_tdata == NULL)
4956     free (external_relocs);
4957   return true;
4958
4959  error_return:
4960   if (contents != NULL)
4961     free (contents);
4962   if (external_relocs != NULL && section_tdata == NULL)
4963     free (external_relocs);
4964   return false;
4965 }
4966
4967 /* Generate a reloc when linking an ECOFF file.  This is a reloc
4968    requested by the linker, and does come from any input file.  This
4969    is used to build constructor and destructor tables when linking
4970    with -Ur.  */
4971
4972 static boolean
4973 ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
4974      bfd *output_bfd;
4975      struct bfd_link_info *info;
4976      asection *output_section;
4977      struct bfd_link_order *link_order;
4978 {
4979   arelent rel;
4980   struct internal_reloc in;
4981   bfd_size_type external_reloc_size;
4982   bfd_byte *rbuf;
4983   boolean ok;
4984
4985   /* We set up an arelent to pass to the backend adjust_reloc_out
4986      routine.  */
4987   rel.address = link_order->offset;
4988
4989   rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4990   if (rel.howto == 0)
4991     {
4992       bfd_set_error (bfd_error_bad_value);
4993       return false;
4994     }
4995
4996   if (link_order->type == bfd_section_reloc_link_order)
4997     rel.sym_ptr_ptr = link_order->u.reloc.p->u.section->symbol_ptr_ptr;
4998   else
4999     {
5000       /* We can't set up a reloc against a symbol correctly, because
5001          we have no asymbol structure.  Currently no adjust_reloc_out
5002          routine cases.  */
5003       rel.sym_ptr_ptr = (asymbol **) NULL;
5004     }
5005
5006   /* All ECOFF relocs are in-place.  Put the addend into the object
5007      file.  */
5008
5009   BFD_ASSERT (rel.howto->partial_inplace);
5010   if (link_order->u.reloc.p->addend != 0)
5011     {
5012       bfd_size_type size;
5013       bfd_reloc_status_type rstat;
5014       bfd_byte *buf;
5015       boolean ok;
5016
5017       size = bfd_get_reloc_size (rel.howto);
5018       buf = (bfd_byte *) bfd_zmalloc (size);
5019       if (buf == (bfd_byte *) NULL)
5020         {
5021           bfd_set_error (bfd_error_no_memory);
5022           return false;
5023         }
5024       rstat = _bfd_relocate_contents (rel.howto, output_bfd,
5025                                       link_order->u.reloc.p->addend, buf);
5026       switch (rstat)
5027         {
5028         case bfd_reloc_ok:
5029           break;
5030         default:
5031         case bfd_reloc_outofrange:
5032           abort ();
5033         case bfd_reloc_overflow:
5034           if (! ((*info->callbacks->reloc_overflow)
5035                  (info,
5036                   (link_order->type == bfd_section_reloc_link_order
5037                    ? bfd_section_name (output_bfd,
5038                                        link_order->u.reloc.p->u.section)
5039                    : link_order->u.reloc.p->u.name),
5040                   rel.howto->name, link_order->u.reloc.p->addend,
5041                   (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
5042             {
5043               free (buf);
5044               return false;
5045             }
5046           break;
5047         }
5048       ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
5049                                      (file_ptr) link_order->offset, size);
5050       free (buf);
5051       if (! ok)
5052         return false;
5053     }
5054
5055   rel.addend = 0;
5056
5057   /* Move the information into a internal_reloc structure.  */
5058   in.r_vaddr = (rel.address
5059                 + bfd_get_section_vma (output_bfd, output_section));
5060   in.r_type = rel.howto->type;
5061
5062   if (link_order->type == bfd_symbol_reloc_link_order)
5063     {
5064       struct ecoff_link_hash_entry *h;
5065
5066       h = ecoff_link_hash_lookup (ecoff_hash_table (info),
5067                                   link_order->u.reloc.p->u.name,
5068                                   false, false, true);
5069       if (h != (struct ecoff_link_hash_entry *) NULL
5070           && h->indx != -1)
5071         in.r_symndx = h->indx;
5072       else
5073         {
5074           if (! ((*info->callbacks->unattached_reloc)
5075                  (info, link_order->u.reloc.p->u.name, (bfd *) NULL,
5076                   (asection *) NULL, (bfd_vma) 0)))
5077             return false;
5078           in.r_symndx = 0;
5079         }
5080       in.r_extern = 1;
5081     }
5082   else
5083     {
5084       CONST char *name;
5085
5086       name = bfd_get_section_name (output_bfd,
5087                                    link_order->u.reloc.p->u.section);
5088       if (strcmp (name, ".text") == 0)
5089         in.r_symndx = RELOC_SECTION_TEXT;
5090       else if (strcmp (name, ".rdata") == 0)
5091         in.r_symndx = RELOC_SECTION_RDATA;
5092       else if (strcmp (name, ".data") == 0)
5093         in.r_symndx = RELOC_SECTION_DATA;
5094       else if (strcmp (name, ".sdata") == 0)
5095         in.r_symndx = RELOC_SECTION_SDATA;
5096       else if (strcmp (name, ".sbss") == 0)
5097         in.r_symndx = RELOC_SECTION_SBSS;
5098       else if (strcmp (name, ".bss") == 0)
5099         in.r_symndx = RELOC_SECTION_BSS;
5100       else if (strcmp (name, ".init") == 0)
5101         in.r_symndx = RELOC_SECTION_INIT;
5102       else if (strcmp (name, ".lit8") == 0)
5103         in.r_symndx = RELOC_SECTION_LIT8;
5104       else if (strcmp (name, ".lit4") == 0)
5105         in.r_symndx = RELOC_SECTION_LIT4;
5106       else if (strcmp (name, ".xdata") == 0)
5107         in.r_symndx = RELOC_SECTION_XDATA;
5108       else if (strcmp (name, ".pdata") == 0)
5109         in.r_symndx = RELOC_SECTION_PDATA;
5110       else if (strcmp (name, ".fini") == 0)
5111         in.r_symndx = RELOC_SECTION_FINI;
5112       else if (strcmp (name, ".lita") == 0)
5113         in.r_symndx = RELOC_SECTION_LITA;
5114       else if (strcmp (name, "*ABS*") == 0)
5115         in.r_symndx = RELOC_SECTION_ABS;
5116       else
5117         abort ();
5118       in.r_extern = 0;
5119     }
5120
5121   /* Let the BFD backend adjust the reloc.  */
5122   (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
5123
5124   /* Get some memory and swap out the reloc.  */
5125   external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
5126   rbuf = (bfd_byte *) malloc (external_reloc_size);
5127   if (rbuf == (bfd_byte *) NULL)
5128     {
5129       bfd_set_error (bfd_error_no_memory);
5130       return false;
5131     }
5132
5133   (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf);
5134
5135   ok = (bfd_seek (output_bfd,
5136                   (output_section->rel_filepos +
5137                    output_section->reloc_count * external_reloc_size),
5138                   SEEK_SET) == 0
5139         && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd)
5140             == external_reloc_size));
5141
5142   if (ok)
5143     ++output_section->reloc_count;
5144
5145   free (rbuf);
5146
5147   return ok;
5148 }