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