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

Subversion Repositories or1k_old

[/] [or1k_old/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [ecoff.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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