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