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