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