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