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