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