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