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