OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [ecoff.c] - Blame information for rev 1776

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.