]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/ecoff.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / ecoff.c
CommitLineData
252b5132 1/* Generic ECOFF (Extended-COFF) routines.
a2c58332 2 Copyright (C) 1990-2022 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);
1c5e9d8d 1609 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1992e26e 1610 rptr->addend = 0;
252b5132
RH
1611
1612 if (intern.r_extern)
1613 {
1614 /* r_symndx is an index into the external symbols. */
1992e26e
AM
1615 if (intern.r_symndx >= 0
1616 && (intern.r_symndx
1617 < (ecoff_data (abfd)->debug_info.symbolic_header.iextMax)))
1618 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
252b5132 1619 }
252b5132
RH
1620 else
1621 {
dc810e39 1622 const char *sec_name;
252b5132
RH
1623 asection *sec;
1624
1625 /* r_symndx is a section key. */
1626 switch (intern.r_symndx)
1627 {
3b5d3310
NC
1628 case RELOC_SECTION_TEXT: sec_name = _TEXT; break;
1629 case RELOC_SECTION_RDATA: sec_name = _RDATA; break;
1630 case RELOC_SECTION_DATA: sec_name = _DATA; break;
1631 case RELOC_SECTION_SDATA: sec_name = _SDATA; break;
1632 case RELOC_SECTION_SBSS: sec_name = _SBSS; break;
1633 case RELOC_SECTION_BSS: sec_name = _BSS; break;
1634 case RELOC_SECTION_INIT: sec_name = _INIT; break;
1635 case RELOC_SECTION_LIT8: sec_name = _LIT8; break;
1636 case RELOC_SECTION_LIT4: sec_name = _LIT4; break;
1637 case RELOC_SECTION_XDATA: sec_name = _XDATA; break;
1638 case RELOC_SECTION_PDATA: sec_name = _PDATA; break;
1639 case RELOC_SECTION_FINI: sec_name = _FINI; break;
1640 case RELOC_SECTION_LITA: sec_name = _LITA; break;
1641 case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
1992e26e
AM
1642 default:
1643 sec_name = NULL;
1644 break;
252b5132
RH
1645 }
1646
1992e26e
AM
1647 if (sec_name != NULL)
1648 {
1649 sec = bfd_get_section_by_name (abfd, sec_name);
1650 if (sec != NULL)
1651 {
1652 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1653 rptr->addend = - bfd_section_vma (sec);
1654 }
1655 }
252b5132
RH
1656 }
1657
fd361982 1658 rptr->address = intern.r_vaddr - bfd_section_vma (section);
252b5132
RH
1659
1660 /* Let the backend select the howto field and do any other
1661 required processing. */
1662 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1663 }
1664
7a87e9c8 1665 free (external_relocs);
252b5132
RH
1666
1667 section->relocation = internal_relocs;
1668
0a1b45a2 1669 return true;
252b5132
RH
1670}
1671
1672/* Get a canonical list of relocs. */
1673
1674long
3b5d3310
NC
1675_bfd_ecoff_canonicalize_reloc (bfd *abfd,
1676 asection *section,
1677 arelent **relptr,
1678 asymbol **symbols)
252b5132
RH
1679{
1680 unsigned int count;
1681
1abaf976 1682 if (section->flags & SEC_CONSTRUCTOR)
252b5132
RH
1683 {
1684 arelent_chain *chain;
1685
1686 /* This section has relocs made up by us, not the file, so take
1687 them out of their chain and place them into the data area
1688 provided. */
1689 for (count = 0, chain = section->constructor_chain;
1690 count < section->reloc_count;
1691 count++, chain = chain->next)
1692 *relptr++ = &chain->relent;
1693 }
1694 else
1abaf976 1695 {
252b5132
RH
1696 arelent *tblptr;
1697
82e51918 1698 if (! ecoff_slurp_reloc_table (abfd, section, symbols))
252b5132
RH
1699 return -1;
1700
1701 tblptr = section->relocation;
1702
1703 for (count = 0; count < section->reloc_count; count++)
1704 *relptr++ = tblptr++;
1705 }
1706
3b5d3310 1707 *relptr = NULL;
252b5132
RH
1708
1709 return section->reloc_count;
1710}
1711\f
1712/* Provided a BFD, a section and an offset into the section, calculate
1713 and return the name of the source file and the line nearest to the
1714 wanted location. */
1715
0a1b45a2 1716bool
3b5d3310 1717_bfd_ecoff_find_nearest_line (bfd *abfd,
fb167eb2 1718 asymbol **symbols ATTRIBUTE_UNUSED,
3b5d3310 1719 asection *section,
3b5d3310
NC
1720 bfd_vma offset,
1721 const char **filename_ptr,
1722 const char **functionname_ptr,
fb167eb2
AM
1723 unsigned int *retline_ptr,
1724 unsigned int *discriminator_ptr)
252b5132
RH
1725{
1726 const struct ecoff_debug_swap * const debug_swap
1727 = &ecoff_backend (abfd)->debug_swap;
1728 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1729 struct ecoff_find_line *line_info;
1730
1731 /* Make sure we have the FDR's. */
3b5d3310 1732 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, debug_info)
252b5132 1733 || bfd_get_symcount (abfd) == 0)
0a1b45a2 1734 return false;
252b5132
RH
1735
1736 if (ecoff_data (abfd)->find_line_info == NULL)
1737 {
986f0783 1738 size_t amt = sizeof (struct ecoff_find_line);
3b5d3310 1739
21d799b5 1740 ecoff_data (abfd)->find_line_info =
07d6d2b8 1741 (struct ecoff_find_line *) bfd_zalloc (abfd, amt);
252b5132 1742 if (ecoff_data (abfd)->find_line_info == NULL)
0a1b45a2 1743 return false;
252b5132 1744 }
252b5132 1745
fb167eb2
AM
1746 if (discriminator_ptr)
1747 *discriminator_ptr = 0;
1748 line_info = ecoff_data (abfd)->find_line_info;
252b5132
RH
1749 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1750 debug_swap, line_info, filename_ptr,
1751 functionname_ptr, retline_ptr);
1752}
1753\f
1754/* Copy private BFD data. This is called by objcopy and strip. We
1755 use it to copy the ECOFF debugging information from one BFD to the
1756 other. It would be theoretically possible to represent the ECOFF
1757 debugging information in the symbol table. However, it would be a
1758 lot of work, and there would be little gain (gas, gdb, and ld
1759 already access the ECOFF debugging information via the
1760 ecoff_debug_info structure, and that structure would have to be
1761 retained in order to support ECOFF debugging in MIPS ELF).
1762
1763 The debugging information for the ECOFF external symbols comes from
1764 the symbol table, so this function only handles the other debugging
1765 information. */
1766
0a1b45a2 1767bool
3b5d3310 1768_bfd_ecoff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
252b5132
RH
1769{
1770 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1771 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
3b5d3310 1772 int i;
252b5132
RH
1773 asymbol **sym_ptr_ptr;
1774 size_t c;
0a1b45a2 1775 bool local;
252b5132
RH
1776
1777 /* We only want to copy information over if both BFD's use ECOFF
1778 format. */
1779 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1780 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
0a1b45a2 1781 return true;
252b5132
RH
1782
1783 /* Copy the GP value and the register masks. */
1784 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1785 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1786 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1787 for (i = 0; i < 3; i++)
1788 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1789
1790 /* Copy the version stamp. */
1791 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1792
1793 /* If there are no symbols, don't copy any debugging information. */
1794 c = bfd_get_symcount (obfd);
1795 sym_ptr_ptr = bfd_get_outsymbols (obfd);
3b5d3310 1796 if (c == 0 || sym_ptr_ptr == NULL)
0a1b45a2 1797 return true;
252b5132
RH
1798
1799 /* See if there are any local symbols. */
0a1b45a2 1800 local = false;
252b5132
RH
1801 for (; c > 0; c--, sym_ptr_ptr++)
1802 {
1803 if (ecoffsymbol (*sym_ptr_ptr)->local)
1804 {
0a1b45a2 1805 local = true;
252b5132
RH
1806 break;
1807 }
1808 }
1809
1810 if (local)
1811 {
1812 /* There are some local symbols. We just bring over all the
1813 debugging information. FIXME: This is not quite the right
1814 thing to do. If the user has asked us to discard all
1815 debugging information, then we are probably going to wind up
1816 keeping it because there will probably be some local symbol
1817 which objcopy did not discard. We should actually break
1818 apart the debugging information and only keep that which
1819 applies to the symbols we want to keep. */
1820 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1821 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1822 oinfo->line = iinfo->line;
1823
1824 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1825 oinfo->external_dnr = iinfo->external_dnr;
1826
1827 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1828 oinfo->external_pdr = iinfo->external_pdr;
1829
1830 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1831 oinfo->external_sym = iinfo->external_sym;
1832
1833 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1834 oinfo->external_opt = iinfo->external_opt;
1835
1836 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1837 oinfo->external_aux = iinfo->external_aux;
1838
1839 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1840 oinfo->ss = iinfo->ss;
1841
1842 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1843 oinfo->external_fdr = iinfo->external_fdr;
1844
1845 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1846 oinfo->external_rfd = iinfo->external_rfd;
1847 }
1848 else
1849 {
1850 /* We are discarding all the local symbol information. Look
1851 through the external symbols and remove all references to FDR
1852 or aux information. */
1853 c = bfd_get_symcount (obfd);
1854 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1855 for (; c > 0; c--, sym_ptr_ptr++)
1856 {
1857 EXTR esym;
1858
1859 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1860 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1861 esym.ifd = ifdNil;
1862 esym.asym.index = indexNil;
1863 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1864 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1865 }
1866 }
1867
0a1b45a2 1868 return true;
252b5132
RH
1869}
1870\f
1871/* Set the architecture. The supported architecture is stored in the
1872 backend pointer. We always set the architecture anyhow, since many
1873 callers ignore the return value. */
1874
0a1b45a2 1875bool
3b5d3310
NC
1876_bfd_ecoff_set_arch_mach (bfd *abfd,
1877 enum bfd_architecture arch,
1878 unsigned long machine)
252b5132
RH
1879{
1880 bfd_default_set_arch_mach (abfd, arch, machine);
1881 return arch == ecoff_backend (abfd)->arch;
1882}
1883
1884/* Get the size of the section headers. */
1885
252b5132 1886int
a6b96beb
AM
1887_bfd_ecoff_sizeof_headers (bfd *abfd,
1888 struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132
RH
1889{
1890 asection *current;
1891 int c;
1892 int ret;
1893
1894 c = 0;
1895 for (current = abfd->sections;
3b5d3310 1896 current != NULL;
1abaf976 1897 current = current->next)
252b5132
RH
1898 ++c;
1899
1900 ret = (bfd_coff_filhsz (abfd)
1901 + bfd_coff_aoutsz (abfd)
1902 + c * bfd_coff_scnhsz (abfd));
544008aa 1903 return (int) BFD_ALIGN (ret, 16);
252b5132
RH
1904}
1905
1906/* Get the contents of a section. */
1907
0a1b45a2 1908bool
3b5d3310
NC
1909_bfd_ecoff_get_section_contents (bfd *abfd,
1910 asection *section,
1911 void * location,
1912 file_ptr offset,
1913 bfd_size_type count)
252b5132
RH
1914{
1915 return _bfd_generic_get_section_contents (abfd, section, location,
1916 offset, count);
1917}
1918
1919/* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1920 called via qsort. */
1921
1922static int
3b5d3310 1923ecoff_sort_hdrs (const void * arg1, const void * arg2)
252b5132
RH
1924{
1925 const asection *hdr1 = *(const asection **) arg1;
1926 const asection *hdr2 = *(const asection **) arg2;
1927
1928 if ((hdr1->flags & SEC_ALLOC) != 0)
1929 {
1930 if ((hdr2->flags & SEC_ALLOC) == 0)
1931 return -1;
1932 }
1933 else
1934 {
1935 if ((hdr2->flags & SEC_ALLOC) != 0)
1936 return 1;
1937 }
1938 if (hdr1->vma < hdr2->vma)
1939 return -1;
1940 else if (hdr1->vma > hdr2->vma)
1941 return 1;
1942 else
1943 return 0;
1944}
1945
1946/* Calculate the file position for each section, and set
1947 reloc_filepos. */
1948
0a1b45a2 1949static bool
3b5d3310 1950ecoff_compute_section_file_positions (bfd *abfd)
252b5132
RH
1951{
1952 file_ptr sofar, file_sofar;
1953 asection **sorted_hdrs;
1954 asection *current;
1955 unsigned int i;
1956 file_ptr old_sofar;
0a1b45a2
AM
1957 bool rdata_in_text;
1958 bool first_data, first_nonalloc;
252b5132 1959 const bfd_vma round = ecoff_backend (abfd)->round;
dc810e39 1960 bfd_size_type amt;
252b5132 1961
a6b96beb 1962 sofar = _bfd_ecoff_sizeof_headers (abfd, NULL);
252b5132
RH
1963 file_sofar = sofar;
1964
1965 /* Sort the sections by VMA. */
dc810e39
AM
1966 amt = abfd->section_count;
1967 amt *= sizeof (asection *);
21d799b5 1968 sorted_hdrs = (asection **) bfd_malloc (amt);
252b5132 1969 if (sorted_hdrs == NULL)
0a1b45a2 1970 return false;
252b5132
RH
1971 for (current = abfd->sections, i = 0;
1972 current != NULL;
1973 current = current->next, i++)
1974 sorted_hdrs[i] = current;
1975 BFD_ASSERT (i == abfd->section_count);
1976
1977 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
1978 ecoff_sort_hdrs);
1979
1980 /* Some versions of the OSF linker put the .rdata section in the
1981 text segment, and some do not. */
1982 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
1983 if (rdata_in_text)
1984 {
1985 for (i = 0; i < abfd->section_count; i++)
1986 {
1987 current = sorted_hdrs[i];
3b5d3310 1988 if (streq (current->name, _RDATA))
252b5132
RH
1989 break;
1990 if ((current->flags & SEC_CODE) == 0
3b5d3310
NC
1991 && ! streq (current->name, _PDATA)
1992 && ! streq (current->name, _RCONST))
252b5132 1993 {
0a1b45a2 1994 rdata_in_text = false;
252b5132
RH
1995 break;
1996 }
1997 }
1998 }
1999 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
2000
0a1b45a2
AM
2001 first_data = true;
2002 first_nonalloc = true;
252b5132
RH
2003 for (i = 0; i < abfd->section_count; i++)
2004 {
2005 unsigned int alignment_power;
2006
2007 current = sorted_hdrs[i];
2008
2009 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2010 supposed to indicate the number of .pdata entries that are
2011 really in the section. Each entry is 8 bytes. We store this
2012 away in line_filepos before increasing the section size. */
3b5d3310 2013 if (streq (current->name, _PDATA))
eea6121a 2014 current->line_filepos = current->size / 8;
252b5132
RH
2015
2016 alignment_power = current->alignment_power;
2017
2018 /* On Ultrix, the data sections in an executable file must be
2019 aligned to a page boundary within the file. This does not
2020 affect the section size, though. FIXME: Does this work for
2021 other platforms? It requires some modification for the
2022 Alpha, because .rdata on the Alpha goes with the text, not
2023 the data. */
2024 if ((abfd->flags & EXEC_P) != 0
2025 && (abfd->flags & D_PAGED) != 0
2026 && ! first_data
2027 && (current->flags & SEC_CODE) == 0
2028 && (! rdata_in_text
3b5d3310
NC
2029 || ! streq (current->name, _RDATA))
2030 && ! streq (current->name, _PDATA)
2031 && ! streq (current->name, _RCONST))
252b5132
RH
2032 {
2033 sofar = (sofar + round - 1) &~ (round - 1);
2034 file_sofar = (file_sofar + round - 1) &~ (round - 1);
0a1b45a2 2035 first_data = false;
252b5132 2036 }
3b5d3310 2037 else if (streq (current->name, _LIB))
252b5132
RH
2038 {
2039 /* On Irix 4, the location of contents of the .lib section
2040 from a shared library section is also rounded up to a
2041 page boundary. */
2042
2043 sofar = (sofar + round - 1) &~ (round - 1);
2044 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2045 }
2046 else if (first_nonalloc
2047 && (current->flags & SEC_ALLOC) == 0
2048 && (abfd->flags & D_PAGED) != 0)
2049 {
2050 /* Skip up to the next page for an unallocated section, such
07d6d2b8
AM
2051 as the .comment section on the Alpha. This leaves room
2052 for the .bss section. */
0a1b45a2 2053 first_nonalloc = false;
252b5132
RH
2054 sofar = (sofar + round - 1) &~ (round - 1);
2055 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2056 }
2057
2058 /* Align the sections in the file to the same boundary on
2059 which they are aligned in virtual memory. */
2060 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2061 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2062 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2063
2064 if ((abfd->flags & D_PAGED) != 0
2065 && (current->flags & SEC_ALLOC) != 0)
2066 {
2067 sofar += (current->vma - sofar) % round;
2068 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2069 file_sofar += (current->vma - file_sofar) % round;
2070 }
2071
2072 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2073 current->filepos = file_sofar;
2074
eea6121a 2075 sofar += current->size;
252b5132 2076 if ((current->flags & SEC_HAS_CONTENTS) != 0)
eea6121a 2077 file_sofar += current->size;
252b5132 2078
b0ac09d2 2079 /* Make sure that this section is of the right size too. */
252b5132
RH
2080 old_sofar = sofar;
2081 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2082 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2083 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
eea6121a 2084 current->size += sofar - old_sofar;
252b5132
RH
2085 }
2086
2087 free (sorted_hdrs);
2088 sorted_hdrs = NULL;
2089
2090 ecoff_data (abfd)->reloc_filepos = file_sofar;
2091
0a1b45a2 2092 return true;
252b5132
RH
2093}
2094
2095/* Determine the location of the relocs for all the sections in the
2096 output file, as well as the location of the symbolic debugging
2097 information. */
2098
2099static bfd_size_type
3b5d3310 2100ecoff_compute_reloc_file_positions (bfd *abfd)
252b5132
RH
2101{
2102 const bfd_size_type external_reloc_size =
2103 ecoff_backend (abfd)->external_reloc_size;
2104 file_ptr reloc_base;
2105 bfd_size_type reloc_size;
2106 asection *current;
2107 file_ptr sym_base;
2108
2109 if (! abfd->output_has_begun)
2110 {
2111 if (! ecoff_compute_section_file_positions (abfd))
2112 abort ();
0a1b45a2 2113 abfd->output_has_begun = true;
252b5132 2114 }
1abaf976 2115
252b5132
RH
2116 reloc_base = ecoff_data (abfd)->reloc_filepos;
2117
2118 reloc_size = 0;
2119 for (current = abfd->sections;
3b5d3310 2120 current != NULL;
1abaf976 2121 current = current->next)
252b5132
RH
2122 {
2123 if (current->reloc_count == 0)
2124 current->rel_filepos = 0;
2125 else
2126 {
2127 bfd_size_type relsize;
2128
2129 current->rel_filepos = reloc_base;
2130 relsize = current->reloc_count * external_reloc_size;
2131 reloc_size += relsize;
2132 reloc_base += relsize;
2133 }
2134 }
2135
2136 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2137
2138 /* At least on Ultrix, the symbol table of an executable file must
2139 be aligned to a page boundary. FIXME: Is this true on other
2140 platforms? */
2141 if ((abfd->flags & EXEC_P) != 0
2142 && (abfd->flags & D_PAGED) != 0)
2143 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2144 &~ (ecoff_backend (abfd)->round - 1));
2145
2146 ecoff_data (abfd)->sym_filepos = sym_base;
2147
2148 return reloc_size;
2149}
2150
2151/* Set the contents of a section. */
2152
0a1b45a2 2153bool
3b5d3310
NC
2154_bfd_ecoff_set_section_contents (bfd *abfd,
2155 asection *section,
2156 const void * location,
2157 file_ptr offset,
2158 bfd_size_type count)
252b5132 2159{
dc810e39
AM
2160 file_ptr pos;
2161
252b5132 2162 /* This must be done first, because bfd_set_section_contents is
b34976b6 2163 going to set output_has_begun to TRUE. */
3b5d3310
NC
2164 if (! abfd->output_has_begun
2165 && ! ecoff_compute_section_file_positions (abfd))
0a1b45a2 2166 return false;
252b5132
RH
2167
2168 /* Handle the .lib section specially so that Irix 4 shared libraries
2169 work out. See coff_set_section_contents in coffcode.h. */
3b5d3310 2170 if (streq (section->name, _LIB))
252b5132
RH
2171 {
2172 bfd_byte *rec, *recend;
2173
2174 rec = (bfd_byte *) location;
2175 recend = rec + count;
2176 while (rec < recend)
2177 {
2178 ++section->lma;
2179 rec += bfd_get_32 (abfd, rec) * 4;
2180 }
2181
2182 BFD_ASSERT (rec == recend);
2183 }
2184
2185 if (count == 0)
0a1b45a2 2186 return true;
252b5132 2187
dc810e39
AM
2188 pos = section->filepos + offset;
2189 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2190 || bfd_bwrite (location, count, abfd) != count)
0a1b45a2 2191 return false;
252b5132 2192
0a1b45a2 2193 return true;
252b5132
RH
2194}
2195
252b5132
RH
2196/* Set the GP value for an ECOFF file. This is a hook used by the
2197 assembler. */
2198
0a1b45a2 2199bool
3b5d3310 2200bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value)
252b5132
RH
2201{
2202 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2203 || bfd_get_format (abfd) != bfd_object)
2204 {
2205 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 2206 return false;
252b5132
RH
2207 }
2208
2209 ecoff_data (abfd)->gp = gp_value;
2210
0a1b45a2 2211 return true;
252b5132
RH
2212}
2213
2214/* Set the register masks for an ECOFF file. This is a hook used by
2215 the assembler. */
2216
0a1b45a2 2217bool
3b5d3310
NC
2218bfd_ecoff_set_regmasks (bfd *abfd,
2219 unsigned long gprmask,
2220 unsigned long fprmask,
2221 unsigned long *cprmask)
252b5132
RH
2222{
2223 ecoff_data_type *tdata;
2224
2225 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2226 || bfd_get_format (abfd) != bfd_object)
2227 {
2228 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 2229 return false;
252b5132
RH
2230 }
2231
2232 tdata = ecoff_data (abfd);
2233 tdata->gprmask = gprmask;
2234 tdata->fprmask = fprmask;
3b5d3310 2235 if (cprmask != NULL)
252b5132 2236 {
b0ac09d2 2237 int i;
252b5132
RH
2238
2239 for (i = 0; i < 3; i++)
2240 tdata->cprmask[i] = cprmask[i];
2241 }
2242
0a1b45a2 2243 return true;
252b5132
RH
2244}
2245
2246/* Get ECOFF EXTR information for an external symbol. This function
2247 is passed to bfd_ecoff_debug_externals. */
2248
0a1b45a2 2249static bool
3b5d3310 2250ecoff_get_extr (asymbol *sym, EXTR *esym)
252b5132
RH
2251{
2252 ecoff_symbol_type *ecoff_sym_ptr;
2253 bfd *input_bfd;
2254
2255 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2256 || ecoffsymbol (sym)->native == NULL)
2257 {
2258 /* Don't include debugging, local, or section symbols. */
2259 if ((sym->flags & BSF_DEBUGGING) != 0
2260 || (sym->flags & BSF_LOCAL) != 0
2261 || (sym->flags & BSF_SECTION_SYM) != 0)
0a1b45a2 2262 return false;
252b5132
RH
2263
2264 esym->jmptbl = 0;
2265 esym->cobol_main = 0;
2266 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2267 esym->reserved = 0;
2268 esym->ifd = ifdNil;
2269 /* FIXME: we can do better than this for st and sc. */
2270 esym->asym.st = stGlobal;
2271 esym->asym.sc = scAbs;
2272 esym->asym.reserved = 0;
2273 esym->asym.index = indexNil;
0a1b45a2 2274 return true;
252b5132
RH
2275 }
2276
2277 ecoff_sym_ptr = ecoffsymbol (sym);
2278
2279 if (ecoff_sym_ptr->local)
0a1b45a2 2280 return false;
252b5132
RH
2281
2282 input_bfd = bfd_asymbol_bfd (sym);
2283 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2284 (input_bfd, ecoff_sym_ptr->native, esym);
2285
2286 /* If the symbol was defined by the linker, then esym will be
2287 undefined but sym will not be. Get a better class for such a
2288 symbol. */
2289 if ((esym->asym.sc == scUndefined
2290 || esym->asym.sc == scSUndefined)
e6f7f6d1 2291 && ! bfd_is_und_section (bfd_asymbol_section (sym)))
252b5132
RH
2292 esym->asym.sc = scAbs;
2293
2294 /* Adjust the FDR index for the symbol by that used for the input
2295 BFD. */
2296 if (esym->ifd != -1)
2297 {
2298 struct ecoff_debug_info *input_debug;
2299
2300 input_debug = &ecoff_data (input_bfd)->debug_info;
2301 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
3b5d3310 2302 if (input_debug->ifdmap != NULL)
252b5132
RH
2303 esym->ifd = input_debug->ifdmap[esym->ifd];
2304 }
2305
0a1b45a2 2306 return true;
252b5132
RH
2307}
2308
2309/* Set the external symbol index. This routine is passed to
2310 bfd_ecoff_debug_externals. */
2311
2312static void
3b5d3310 2313ecoff_set_index (asymbol *sym, bfd_size_type indx)
252b5132
RH
2314{
2315 ecoff_set_sym_index (sym, indx);
2316}
2317
2318/* Write out an ECOFF file. */
2319
0a1b45a2 2320bool
3b5d3310 2321_bfd_ecoff_write_object_contents (bfd *abfd)
252b5132
RH
2322{
2323 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2324 const bfd_vma round = backend->round;
2325 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2326 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2327 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2328 const bfd_size_type external_hdr_size
2329 = backend->debug_swap.external_hdr_size;
2330 const bfd_size_type external_reloc_size = backend->external_reloc_size;
3b5d3310 2331 void (* const adjust_reloc_out) (bfd *, const arelent *, struct internal_reloc *)
252b5132 2332 = backend->adjust_reloc_out;
3b5d3310 2333 void (* const swap_reloc_out) (bfd *, const struct internal_reloc *, void *)
252b5132
RH
2334 = backend->swap_reloc_out;
2335 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2336 HDRR * const symhdr = &debug->symbolic_header;
2337 asection *current;
2338 unsigned int count;
2339 bfd_size_type reloc_size;
2340 bfd_size_type text_size;
2341 bfd_vma text_start;
0a1b45a2 2342 bool set_text_start;
252b5132
RH
2343 bfd_size_type data_size;
2344 bfd_vma data_start;
0a1b45a2 2345 bool set_data_start;
252b5132 2346 bfd_size_type bss_size;
3b5d3310
NC
2347 void * buff = NULL;
2348 void * reloc_buff = NULL;
252b5132
RH
2349 struct internal_filehdr internal_f;
2350 struct internal_aouthdr internal_a;
2351 int i;
2352
2353 /* Determine where the sections and relocs will go in the output
2354 file. */
2355 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2356
2357 count = 1;
2358 for (current = abfd->sections;
3b5d3310 2359 current != NULL;
1abaf976 2360 current = current->next)
252b5132
RH
2361 {
2362 current->target_index = count;
2363 ++count;
2364 }
2365
2366 if ((abfd->flags & D_PAGED) != 0)
a6b96beb 2367 text_size = _bfd_ecoff_sizeof_headers (abfd, NULL);
252b5132
RH
2368 else
2369 text_size = 0;
2370 text_start = 0;
0a1b45a2 2371 set_text_start = false;
252b5132
RH
2372 data_size = 0;
2373 data_start = 0;
0a1b45a2 2374 set_data_start = false;
252b5132
RH
2375 bss_size = 0;
2376
2377 /* Write section headers to the file. */
2378
2379 /* Allocate buff big enough to hold a section header,
2380 file header, or a.out header. */
2381 {
2382 bfd_size_type siz;
3b5d3310 2383
252b5132
RH
2384 siz = scnhsz;
2385 if (siz < filhsz)
2386 siz = filhsz;
2387 if (siz < aoutsz)
2388 siz = aoutsz;
3b5d3310 2389 buff = bfd_malloc (siz);
252b5132
RH
2390 if (buff == NULL)
2391 goto error_return;
2392 }
2393
2394 internal_f.f_nscns = 0;
2395 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2396 goto error_return;
3b5d3310 2397
252b5132 2398 for (current = abfd->sections;
3b5d3310 2399 current != NULL;
252b5132
RH
2400 current = current->next)
2401 {
2402 struct internal_scnhdr section;
2403 bfd_vma vma;
2404
2405 ++internal_f.f_nscns;
2406
2407 strncpy (section.s_name, current->name, sizeof section.s_name);
2408
2409 /* This seems to be correct for Irix 4 shared libraries. */
fd361982 2410 vma = bfd_section_vma (current);
3b5d3310 2411 if (streq (current->name, _LIB))
252b5132
RH
2412 section.s_vaddr = 0;
2413 else
2414 section.s_vaddr = vma;
2415
2416 section.s_paddr = current->lma;
eea6121a 2417 section.s_size = current->size;
252b5132
RH
2418
2419 /* If this section is unloadable then the scnptr will be 0. */
2420 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2421 section.s_scnptr = 0;
2422 else
2423 section.s_scnptr = current->filepos;
2424 section.s_relptr = current->rel_filepos;
2425
2426 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2427 object file produced by the assembler is supposed to point to
2428 information about how much room is required by objects of
2429 various different sizes. I think this only matters if we
2430 want the linker to compute the best size to use, or
2431 something. I don't know what happens if the information is
2432 not present. */
3b5d3310 2433 if (! streq (current->name, _PDATA))
252b5132
RH
2434 section.s_lnnoptr = 0;
2435 else
2436 {
2437 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2438 hold the number of entries in the section (each entry is
2439 8 bytes). We stored this in the line_filepos field in
2440 ecoff_compute_section_file_positions. */
2441 section.s_lnnoptr = current->line_filepos;
2442 }
2443
2444 section.s_nreloc = current->reloc_count;
2445 section.s_nlnno = 0;
2446 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2447 current->flags);
2448
3b5d3310 2449 if (bfd_coff_swap_scnhdr_out (abfd, (void *) &section, buff) == 0
dc810e39 2450 || bfd_bwrite (buff, scnhsz, abfd) != scnhsz)
252b5132
RH
2451 goto error_return;
2452
2453 if ((section.s_flags & STYP_TEXT) != 0
2454 || ((section.s_flags & STYP_RDATA) != 0
2455 && ecoff_data (abfd)->rdata_in_text)
2456 || section.s_flags == STYP_PDATA
2457 || (section.s_flags & STYP_DYNAMIC) != 0
2458 || (section.s_flags & STYP_LIBLIST) != 0
2459 || (section.s_flags & STYP_RELDYN) != 0
2460 || section.s_flags == STYP_CONFLIC
2461 || (section.s_flags & STYP_DYNSTR) != 0
2462 || (section.s_flags & STYP_DYNSYM) != 0
2463 || (section.s_flags & STYP_HASH) != 0
2464 || (section.s_flags & STYP_ECOFF_INIT) != 0
2465 || (section.s_flags & STYP_ECOFF_FINI) != 0
2466 || section.s_flags == STYP_RCONST)
2467 {
eea6121a 2468 text_size += current->size;
252b5132
RH
2469 if (! set_text_start || text_start > vma)
2470 {
2471 text_start = vma;
0a1b45a2 2472 set_text_start = true;
252b5132
RH
2473 }
2474 }
2475 else if ((section.s_flags & STYP_RDATA) != 0
2476 || (section.s_flags & STYP_DATA) != 0
2477 || (section.s_flags & STYP_LITA) != 0
2478 || (section.s_flags & STYP_LIT8) != 0
2479 || (section.s_flags & STYP_LIT4) != 0
2480 || (section.s_flags & STYP_SDATA) != 0
2481 || section.s_flags == STYP_XDATA
2482 || (section.s_flags & STYP_GOT) != 0)
2483 {
eea6121a 2484 data_size += current->size;
252b5132
RH
2485 if (! set_data_start || data_start > vma)
2486 {
2487 data_start = vma;
0a1b45a2 2488 set_data_start = true;
252b5132
RH
2489 }
2490 }
2491 else if ((section.s_flags & STYP_BSS) != 0
2492 || (section.s_flags & STYP_SBSS) != 0)
eea6121a 2493 bss_size += current->size;
252b5132
RH
2494 else if (section.s_flags == 0
2495 || (section.s_flags & STYP_ECOFF_LIB) != 0
2496 || section.s_flags == STYP_COMMENT)
b0ac09d2 2497 /* Do nothing. */ ;
252b5132
RH
2498 else
2499 abort ();
1abaf976 2500 }
252b5132
RH
2501
2502 /* Set up the file header. */
252b5132
RH
2503 internal_f.f_magic = ecoff_get_magic (abfd);
2504
2505 /* We will NOT put a fucking timestamp in the header here. Every
2506 time you put it back, I will come in and take it out again. I'm
2507 sorry. This field does not belong here. We fill it with a 0 so
2508 it compares the same but is not a reasonable time. --
2509 gnu@cygnus.com. */
2510 internal_f.f_timdat = 0;
2511
2512 if (bfd_get_symcount (abfd) != 0)
2513 {
2514 /* The ECOFF f_nsyms field is not actually the number of
2515 symbols, it's the size of symbolic information header. */
2516 internal_f.f_nsyms = external_hdr_size;
2517 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2518 }
2519 else
2520 {
2521 internal_f.f_nsyms = 0;
2522 internal_f.f_symptr = 0;
2523 }
2524
2525 internal_f.f_opthdr = aoutsz;
2526
2527 internal_f.f_flags = F_LNNO;
2528 if (reloc_size == 0)
2529 internal_f.f_flags |= F_RELFLG;
2530 if (bfd_get_symcount (abfd) == 0)
2531 internal_f.f_flags |= F_LSYMS;
2532 if (abfd->flags & EXEC_P)
2533 internal_f.f_flags |= F_EXEC;
2534
2535 if (bfd_little_endian (abfd))
2536 internal_f.f_flags |= F_AR32WR;
2537 else
2538 internal_f.f_flags |= F_AR32W;
2539
2540 /* Set up the ``optional'' header. */
2541 if ((abfd->flags & D_PAGED) != 0)
2542 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2543 else
2544 internal_a.magic = ECOFF_AOUT_OMAGIC;
2545
2546 /* FIXME: Is this really correct? */
2547 internal_a.vstamp = symhdr->vstamp;
2548
2549 /* At least on Ultrix, these have to be rounded to page boundaries.
2550 FIXME: Is this true on other platforms? */
2551 if ((abfd->flags & D_PAGED) != 0)
2552 {
2553 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2554 internal_a.text_start = text_start &~ (round - 1);
2555 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2556 internal_a.data_start = data_start &~ (round - 1);
2557 }
2558 else
2559 {
2560 internal_a.tsize = text_size;
2561 internal_a.text_start = text_start;
2562 internal_a.dsize = data_size;
2563 internal_a.data_start = data_start;
2564 }
2565
2566 /* On Ultrix, the initial portions of the .sbss and .bss segments
2567 are at the end of the data section. The bsize field in the
2568 optional header records how many bss bytes are required beyond
2569 those in the data section. The value is not rounded to a page
2570 boundary. */
2571 if (bss_size < internal_a.dsize - data_size)
2572 bss_size = 0;
2573 else
2574 bss_size -= internal_a.dsize - data_size;
2575 internal_a.bsize = bss_size;
2576 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2577
2578 internal_a.entry = bfd_get_start_address (abfd);
2579
2580 internal_a.gp_value = ecoff_data (abfd)->gp;
2581
2582 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2583 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2584 for (i = 0; i < 4; i++)
2585 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2586
2587 /* Let the backend adjust the headers if necessary. */
2588 if (backend->adjust_headers)
2589 {
2590 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2591 goto error_return;
2592 }
2593
2594 /* Write out the file header and the optional header. */
252b5132
RH
2595 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2596 goto error_return;
2597
3b5d3310 2598 bfd_coff_swap_filehdr_out (abfd, (void *) &internal_f, buff);
dc810e39 2599 if (bfd_bwrite (buff, filhsz, abfd) != filhsz)
252b5132
RH
2600 goto error_return;
2601
3b5d3310 2602 bfd_coff_swap_aouthdr_out (abfd, (void *) &internal_a, buff);
dc810e39 2603 if (bfd_bwrite (buff, aoutsz, abfd) != aoutsz)
252b5132
RH
2604 goto error_return;
2605
2606 /* Build the external symbol information. This must be done before
2607 writing out the relocs so that we know the symbol indices. We
2608 don't do this if this BFD was created by the backend linker,
2609 since it will have already handled the symbols and relocs. */
2610 if (! ecoff_data (abfd)->linker)
2611 {
2612 symhdr->iextMax = 0;
2613 symhdr->issExtMax = 0;
2614 debug->external_ext = debug->external_ext_end = NULL;
2615 debug->ssext = debug->ssext_end = NULL;
82e51918
AM
2616 if (! bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2617 (abfd->flags & EXEC_P) == 0,
2618 ecoff_get_extr, ecoff_set_index))
252b5132
RH
2619 goto error_return;
2620
2621 /* Write out the relocs. */
2622 for (current = abfd->sections;
3b5d3310 2623 current != NULL;
252b5132
RH
2624 current = current->next)
2625 {
2626 arelent **reloc_ptr_ptr;
2627 arelent **reloc_end;
2628 char *out_ptr;
dc810e39 2629 bfd_size_type amt;
252b5132
RH
2630
2631 if (current->reloc_count == 0)
2632 continue;
2633
dc810e39
AM
2634 amt = current->reloc_count * external_reloc_size;
2635 reloc_buff = bfd_alloc (abfd, amt);
252b5132
RH
2636 if (reloc_buff == NULL)
2637 goto error_return;
2638
2639 reloc_ptr_ptr = current->orelocation;
2640 reloc_end = reloc_ptr_ptr + current->reloc_count;
2641 out_ptr = (char *) reloc_buff;
0adc9281 2642
252b5132
RH
2643 for (;
2644 reloc_ptr_ptr < reloc_end;
2645 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2646 {
2647 arelent *reloc;
2648 asymbol *sym;
2649 struct internal_reloc in;
1abaf976 2650
3b5d3310 2651 memset ((void *) &in, 0, sizeof in);
252b5132
RH
2652
2653 reloc = *reloc_ptr_ptr;
2654 sym = *reloc->sym_ptr_ptr;
2655
0adc9281
NC
2656 /* If the howto field has not been initialised then skip this reloc.
2657 This assumes that an error message has been issued elsewhere. */
2658 if (reloc->howto == NULL)
2659 continue;
2660
fd361982 2661 in.r_vaddr = reloc->address + bfd_section_vma (current);
252b5132
RH
2662 in.r_type = reloc->howto->type;
2663
2664 if ((sym->flags & BSF_SECTION_SYM) == 0)
2665 {
2666 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2667 in.r_extern = 1;
2668 }
2669 else
2670 {
dc810e39 2671 const char *name;
91d6fa6a 2672 unsigned int j;
3b5d3310
NC
2673 static struct
2674 {
2675 const char * name;
2676 long r_symndx;
2677 }
2678 section_symndx [] =
2679 {
2680 { _TEXT, RELOC_SECTION_TEXT },
2681 { _RDATA, RELOC_SECTION_RDATA },
2682 { _DATA, RELOC_SECTION_DATA },
2683 { _SDATA, RELOC_SECTION_SDATA },
2684 { _SBSS, RELOC_SECTION_SBSS },
2685 { _BSS, RELOC_SECTION_BSS },
2686 { _INIT, RELOC_SECTION_INIT },
2687 { _LIT8, RELOC_SECTION_LIT8 },
2688 { _LIT4, RELOC_SECTION_LIT4 },
2689 { _XDATA, RELOC_SECTION_XDATA },
2690 { _PDATA, RELOC_SECTION_PDATA },
2691 { _FINI, RELOC_SECTION_FINI },
2692 { _LITA, RELOC_SECTION_LITA },
2693 { "*ABS*", RELOC_SECTION_ABS },
2694 { _RCONST, RELOC_SECTION_RCONST }
2695 };
252b5132 2696
fd361982 2697 name = bfd_section_name (bfd_asymbol_section (sym));
3b5d3310 2698
91d6fa6a
NC
2699 for (j = 0; j < ARRAY_SIZE (section_symndx); j++)
2700 if (streq (name, section_symndx[j].name))
3b5d3310 2701 {
91d6fa6a 2702 in.r_symndx = section_symndx[j].r_symndx;
3b5d3310
NC
2703 break;
2704 }
2705
91d6fa6a 2706 if (j == ARRAY_SIZE (section_symndx))
252b5132
RH
2707 abort ();
2708 in.r_extern = 0;
2709 }
2710
2711 (*adjust_reloc_out) (abfd, reloc, &in);
2712
3b5d3310 2713 (*swap_reloc_out) (abfd, &in, (void *) out_ptr);
252b5132
RH
2714 }
2715
2716 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2717 goto error_return;
dc810e39
AM
2718 amt = current->reloc_count * external_reloc_size;
2719 if (bfd_bwrite (reloc_buff, amt, abfd) != amt)
252b5132
RH
2720 goto error_return;
2721 bfd_release (abfd, reloc_buff);
2722 reloc_buff = NULL;
2723 }
2724
2725 /* Write out the symbolic debugging information. */
2726 if (bfd_get_symcount (abfd) > 0)
2727 {
2728 /* Write out the debugging information. */
82e51918
AM
2729 if (! bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2730 ecoff_data (abfd)->sym_filepos))
252b5132
RH
2731 goto error_return;
2732 }
2733 }
2734
2735 /* The .bss section of a demand paged executable must receive an
2736 entire page. If there are symbols, the symbols will start on the
2737 next page. If there are no symbols, we must fill out the page by
2738 hand. */
2739 if (bfd_get_symcount (abfd) == 0
2740 && (abfd->flags & EXEC_P) != 0
2741 && (abfd->flags & D_PAGED) != 0)
2742 {
2743 char c;
2744
2745 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2746 SEEK_SET) != 0)
2747 goto error_return;
dc810e39 2748 if (bfd_bread (&c, (bfd_size_type) 1, abfd) == 0)
252b5132
RH
2749 c = 0;
2750 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2751 SEEK_SET) != 0)
2752 goto error_return;
dc810e39 2753 if (bfd_bwrite (&c, (bfd_size_type) 1, abfd) != 1)
252b5132
RH
2754 goto error_return;
2755 }
2756
2757 if (reloc_buff != NULL)
2758 bfd_release (abfd, reloc_buff);
c9594989 2759 free (buff);
0a1b45a2 2760 return true;
252b5132
RH
2761 error_return:
2762 if (reloc_buff != NULL)
2763 bfd_release (abfd, reloc_buff);
c9594989 2764 free (buff);
0a1b45a2 2765 return false;
252b5132
RH
2766}
2767\f
2768/* Archive handling. ECOFF uses what appears to be a unique type of
2769 archive header (armap). The byte ordering of the armap and the
2770 contents are encoded in the name of the armap itself. At least for
2771 now, we only support archives with the same byte ordering in the
2772 armap and the contents.
2773
2774 The first four bytes in the armap are the number of symbol
2775 definitions. This is always a power of two.
2776
2777 This is followed by the symbol definitions. Each symbol definition
2778 occupies 8 bytes. The first four bytes are the offset from the
2779 start of the armap strings to the null-terminated string naming
2780 this symbol. The second four bytes are the file offset to the
2781 archive member which defines this symbol. If the second four bytes
2782 are 0, then this is not actually a symbol definition, and it should
2783 be ignored.
2784
2785 The symbols are hashed into the armap with a closed hashing scheme.
2786 See the functions below for the details of the algorithm.
2787
2788 After the symbol definitions comes four bytes holding the size of
2789 the string table, followed by the string table itself. */
2790
2791/* The name of an archive headers looks like this:
2792 __________E[BL]E[BL]_ (with a trailing space).
2793 The trailing space is changed to an X if the archive is changed to
2794 indicate that the armap is out of date.
2795
2796 The Alpha seems to use ________64E[BL]E[BL]_. */
2797
07d6d2b8
AM
2798#define ARMAP_BIG_ENDIAN 'B'
2799#define ARMAP_LITTLE_ENDIAN 'L'
2800#define ARMAP_MARKER 'E'
2801#define ARMAP_START_LENGTH 10
3b5d3310 2802#define ARMAP_HEADER_MARKER_INDEX 10
07d6d2b8
AM
2803#define ARMAP_HEADER_ENDIAN_INDEX 11
2804#define ARMAP_OBJECT_MARKER_INDEX 12
2805#define ARMAP_OBJECT_ENDIAN_INDEX 13
2806#define ARMAP_END_INDEX 14
2807#define ARMAP_END "_ "
252b5132
RH
2808
2809/* This is a magic number used in the hashing algorithm. */
07d6d2b8 2810#define ARMAP_HASH_MAGIC 0x9dd68ab5
252b5132
RH
2811
2812/* This returns the hash value to use for a string. It also sets
2813 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2814 is the number of entries in the hash table, and HLOG is the log
2815 base 2 of SIZE. */
2816
2817static unsigned int
3b5d3310
NC
2818ecoff_armap_hash (const char *s,
2819 unsigned int *rehash,
2820 unsigned int size,
2821 unsigned int hlog)
252b5132
RH
2822{
2823 unsigned int hash;
2824
2825 if (hlog == 0)
2826 return 0;
2827 hash = *s++;
2828 while (*s != '\0')
2829 hash = ((hash >> 27) | (hash << 5)) + *s++;
2830 hash *= ARMAP_HASH_MAGIC;
2831 *rehash = (hash & (size - 1)) | 1;
2832 return hash >> (32 - hlog);
2833}
2834
2835/* Read in the armap. */
2836
0a1b45a2 2837bool
3b5d3310 2838_bfd_ecoff_slurp_armap (bfd *abfd)
252b5132
RH
2839{
2840 char nextname[17];
2841 unsigned int i;
2842 struct areltdata *mapdata;
cf28cfef 2843 bfd_size_type parsed_size, stringsize;
252b5132
RH
2844 char *raw_armap;
2845 struct artdata *ardata;
2846 unsigned int count;
2847 char *raw_ptr;
c6a3cf87 2848 carsym *symdef_ptr;
252b5132 2849 char *stringbase;
dc810e39 2850 bfd_size_type amt;
1abaf976 2851
252b5132 2852 /* Get the name of the first element. */
3b5d3310 2853 i = bfd_bread ((void *) nextname, (bfd_size_type) 16, abfd);
252b5132 2854 if (i == 0)
0a1b45a2 2855 return true;
252b5132 2856 if (i != 16)
0a1b45a2 2857 return false;
252b5132
RH
2858
2859 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
0a1b45a2 2860 return false;
252b5132
RH
2861
2862 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2863 standard COFF armap. We could move the ECOFF armap stuff into
2864 bfd_slurp_armap, but that seems inappropriate since no other
2865 target uses this format. Instead, we check directly for a COFF
2866 armap. */
08dedd66 2867 if (startswith (nextname, "/ "))
252b5132
RH
2868 return bfd_slurp_armap (abfd);
2869
2870 /* See if the first element is an armap. */
e9b095a5 2871 if (strncmp (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH) != 0
252b5132
RH
2872 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
2873 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2874 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2875 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
2876 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2877 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
e9b095a5 2878 || strncmp (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1) != 0)
252b5132 2879 {
0a1b45a2
AM
2880 abfd->has_armap = false;
2881 return true;
252b5132
RH
2882 }
2883
2884 /* Make sure we have the right byte ordering. */
2885 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2886 ^ (bfd_header_big_endian (abfd)))
2887 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2888 ^ (bfd_big_endian (abfd))))
2889 {
2890 bfd_set_error (bfd_error_wrong_format);
0a1b45a2 2891 return false;
252b5132
RH
2892 }
2893
2894 /* Read in the armap. */
2895 ardata = bfd_ardata (abfd);
2896 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
3b5d3310 2897 if (mapdata == NULL)
0a1b45a2 2898 return false;
252b5132 2899 parsed_size = mapdata->parsed_size;
06e7acd7 2900 free (mapdata);
1abaf976 2901
cf28cfef 2902 if (parsed_size + 1 < 9)
252b5132 2903 {
cf28cfef 2904 bfd_set_error (bfd_error_malformed_archive);
0a1b45a2 2905 return false;
252b5132 2906 }
1abaf976 2907
cf28cfef
AM
2908 raw_armap = (char *) _bfd_alloc_and_read (abfd, parsed_size + 1, parsed_size);
2909 if (raw_armap == NULL)
0a1b45a2 2910 return false;
cf28cfef
AM
2911 raw_armap[parsed_size] = 0;
2912
3b5d3310 2913 ardata->tdata = (void *) raw_armap;
252b5132 2914
dc810e39 2915 count = H_GET_32 (abfd, raw_armap);
cf28cfef
AM
2916 if ((parsed_size - 8) / 8 < count)
2917 goto error_malformed;
252b5132
RH
2918
2919 ardata->symdef_count = 0;
3b5d3310 2920 ardata->cache = NULL;
252b5132
RH
2921
2922 /* This code used to overlay the symdefs over the raw archive data,
2923 but that doesn't work on a 64 bit host. */
252b5132 2924 stringbase = raw_armap + count * 8 + 8;
cf28cfef 2925 stringsize = parsed_size - (count * 8 + 8);
252b5132
RH
2926
2927#ifdef CHECK_ARMAP_HASH
2928 {
2929 unsigned int hlog;
2930
2931 /* Double check that I have the hashing algorithm right by making
2932 sure that every symbol can be looked up successfully. */
2933 hlog = 0;
2934 for (i = 1; i < count; i <<= 1)
2935 hlog++;
2936 BFD_ASSERT (i == count);
2937
2938 raw_ptr = raw_armap + 4;
2939 for (i = 0; i < count; i++, raw_ptr += 8)
2940 {
2941 unsigned int name_offset, file_offset;
2942 unsigned int hash, rehash, srch;
1abaf976 2943
dc810e39
AM
2944 name_offset = H_GET_32 (abfd, raw_ptr);
2945 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
252b5132
RH
2946 if (file_offset == 0)
2947 continue;
2948 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
2949 hlog);
2950 if (hash == i)
2951 continue;
2952
2953 /* See if we can rehash to this location. */
2954 for (srch = (hash + rehash) & (count - 1);
2955 srch != hash && srch != i;
2956 srch = (srch + rehash) & (count - 1))
dc810e39 2957 BFD_ASSERT (H_GET_32 (abfd, (raw_armap + 8 + srch * 8)) != 0);
252b5132
RH
2958 BFD_ASSERT (srch == i);
2959 }
2960 }
2961
2962#endif /* CHECK_ARMAP_HASH */
2963
2964 raw_ptr = raw_armap + 4;
2965 for (i = 0; i < count; i++, raw_ptr += 8)
dc810e39 2966 if (H_GET_32 (abfd, (raw_ptr + 4)) != 0)
252b5132
RH
2967 ++ardata->symdef_count;
2968
dc810e39 2969 amt = ardata->symdef_count;
c6a3cf87
AM
2970 amt *= sizeof (carsym);
2971 symdef_ptr = (carsym *) bfd_alloc (abfd, amt);
252b5132 2972 if (!symdef_ptr)
cf28cfef 2973 goto error_exit;
252b5132 2974
c6a3cf87 2975 ardata->symdefs = symdef_ptr;
252b5132
RH
2976
2977 raw_ptr = raw_armap + 4;
2978 for (i = 0; i < count; i++, raw_ptr += 8)
2979 {
2980 unsigned int name_offset, file_offset;
2981
dc810e39 2982 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
252b5132
RH
2983 if (file_offset == 0)
2984 continue;
dc810e39 2985 name_offset = H_GET_32 (abfd, raw_ptr);
cf28cfef
AM
2986 if (name_offset > stringsize)
2987 goto error_malformed;
c6a3cf87 2988 symdef_ptr->name = stringbase + name_offset;
252b5132
RH
2989 symdef_ptr->file_offset = file_offset;
2990 ++symdef_ptr;
2991 }
2992
2993 ardata->first_file_filepos = bfd_tell (abfd);
2994 /* Pad to an even boundary. */
2995 ardata->first_file_filepos += ardata->first_file_filepos % 2;
0a1b45a2
AM
2996 abfd->has_armap = true;
2997 return true;
cf28cfef
AM
2998
2999 error_malformed:
3000 bfd_set_error (bfd_error_malformed_archive);
3001 error_exit:
3002 ardata->symdef_count = 0;
3003 ardata->symdefs = NULL;
3004 ardata->tdata = NULL;
3005 bfd_release (abfd, raw_armap);
0a1b45a2 3006 return false;
252b5132
RH
3007}
3008
3009/* Write out an armap. */
3010
0a1b45a2 3011bool
3b5d3310
NC
3012_bfd_ecoff_write_armap (bfd *abfd,
3013 unsigned int elength,
3014 struct orl *map,
3015 unsigned int orl_count,
3016 int stridx)
252b5132
RH
3017{
3018 unsigned int hashsize, hashlog;
dc810e39 3019 bfd_size_type symdefsize;
252b5132
RH
3020 int padit;
3021 unsigned int stringsize;
3022 unsigned int mapsize;
3023 file_ptr firstreal;
3024 struct ar_hdr hdr;
3025 struct stat statbuf;
3026 unsigned int i;
3027 bfd_byte temp[4];
3028 bfd_byte *hashtable;
3029 bfd *current;
3030 bfd *last_elt;
3031
3032 /* Ultrix appears to use as a hash table size the least power of two
3033 greater than twice the number of entries. */
3034 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3035 ;
3036 hashsize = 1 << hashlog;
3037
3038 symdefsize = hashsize * 8;
3039 padit = stridx % 2;
3040 stringsize = stridx + padit;
3041
1abaf976 3042 /* Include 8 bytes to store symdefsize and stringsize in output. */
252b5132
RH
3043 mapsize = symdefsize + stringsize + 8;
3044
3045 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3046
3b5d3310 3047 memset ((void *) &hdr, 0, sizeof hdr);
252b5132
RH
3048
3049 /* Work out the ECOFF armap name. */
3050 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3051 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3052 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3053 (bfd_header_big_endian (abfd)
3054 ? ARMAP_BIG_ENDIAN
3055 : ARMAP_LITTLE_ENDIAN);
3056 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3057 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3058 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3059 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3060
3061 /* Write the timestamp of the archive header to be just a little bit
3062 later than the timestamp of the file, otherwise the linker will
3063 complain that the index is out of date. Actually, the Ultrix
3064 linker just checks the archive name; the GNU linker may check the
3065 date. */
765cf5f6 3066 stat (bfd_get_filename (abfd), &statbuf);
c6a3cf87
AM
3067 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
3068 (long) (statbuf.st_mtime + 60));
252b5132
RH
3069
3070 /* The DECstation uses zeroes for the uid, gid and mode of the
3071 armap. */
3072 hdr.ar_uid[0] = '0';
3073 hdr.ar_gid[0] = '0';
1abaf976 3074 /* Building gcc ends up extracting the armap as a file - twice. */
ec0ef80e
DD
3075 hdr.ar_mode[0] = '6';
3076 hdr.ar_mode[1] = '4';
3077 hdr.ar_mode[2] = '4';
252b5132 3078
c6a3cf87 3079 _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
252b5132
RH
3080
3081 hdr.ar_fmag[0] = '`';
3082 hdr.ar_fmag[1] = '\012';
3083
3084 /* Turn all null bytes in the header into spaces. */
3085 for (i = 0; i < sizeof (struct ar_hdr); i++)
1abaf976
KH
3086 if (((char *) (&hdr))[i] == '\0')
3087 (((char *) (&hdr))[i]) = ' ';
252b5132 3088
3b5d3310 3089 if (bfd_bwrite ((void *) &hdr, (bfd_size_type) sizeof (struct ar_hdr), abfd)
252b5132 3090 != sizeof (struct ar_hdr))
0a1b45a2 3091 return false;
252b5132 3092
dc810e39 3093 H_PUT_32 (abfd, hashsize, temp);
3b5d3310 3094 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
0a1b45a2 3095 return false;
1abaf976 3096
21d799b5 3097 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
252b5132 3098 if (!hashtable)
0a1b45a2 3099 return false;
252b5132
RH
3100
3101 current = abfd->archive_head;
3102 last_elt = current;
3103 for (i = 0; i < orl_count; i++)
3104 {
1b0b5b1b 3105 unsigned int hash, rehash = 0;
252b5132
RH
3106
3107 /* Advance firstreal to the file position of this archive
3108 element. */
dc810e39 3109 if (map[i].u.abfd != last_elt)
252b5132
RH
3110 {
3111 do
3112 {
3113 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3114 firstreal += firstreal % 2;
cc481421 3115 current = current->archive_next;
252b5132 3116 }
dc810e39 3117 while (current != map[i].u.abfd);
252b5132
RH
3118 }
3119
3120 last_elt = current;
3121
3122 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
dc810e39 3123 if (H_GET_32 (abfd, (hashtable + (hash * 8) + 4)) != 0)
252b5132
RH
3124 {
3125 unsigned int srch;
3126
3127 /* The desired slot is already taken. */
3128 for (srch = (hash + rehash) & (hashsize - 1);
3129 srch != hash;
3130 srch = (srch + rehash) & (hashsize - 1))
dc810e39 3131 if (H_GET_32 (abfd, (hashtable + (srch * 8) + 4)) == 0)
252b5132
RH
3132 break;
3133
3134 BFD_ASSERT (srch != hash);
3135
3136 hash = srch;
3137 }
1abaf976 3138
dc810e39
AM
3139 H_PUT_32 (abfd, map[i].namidx, (hashtable + hash * 8));
3140 H_PUT_32 (abfd, firstreal, (hashtable + hash * 8 + 4));
252b5132
RH
3141 }
3142
3b5d3310 3143 if (bfd_bwrite ((void *) hashtable, symdefsize, abfd) != symdefsize)
0a1b45a2 3144 return false;
252b5132
RH
3145
3146 bfd_release (abfd, hashtable);
3147
3148 /* Now write the strings. */
dc810e39 3149 H_PUT_32 (abfd, stringsize, temp);
3b5d3310 3150 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
0a1b45a2 3151 return false;
252b5132
RH
3152 for (i = 0; i < orl_count; i++)
3153 {
3154 bfd_size_type len;
3155
3156 len = strlen (*map[i].name) + 1;
3b5d3310 3157 if (bfd_bwrite ((void *) (*map[i].name), len, abfd) != len)
0a1b45a2 3158 return false;
252b5132
RH
3159 }
3160
3161 /* The spec sez this should be a newline. But in order to be
3162 bug-compatible for DECstation ar we use a null. */
3163 if (padit)
3164 {
dc810e39 3165 if (bfd_bwrite ("", (bfd_size_type) 1, abfd) != 1)
0a1b45a2 3166 return false;
252b5132
RH
3167 }
3168
0a1b45a2 3169 return true;
252b5132 3170}
252b5132
RH
3171\f
3172/* ECOFF linker code. */
3173
252b5132
RH
3174/* Routine to create an entry in an ECOFF link hash table. */
3175
3176static struct bfd_hash_entry *
3b5d3310
NC
3177ecoff_link_hash_newfunc (struct bfd_hash_entry *entry,
3178 struct bfd_hash_table *table,
3179 const char *string)
252b5132
RH
3180{
3181 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3182
3183 /* Allocate the structure if it has not already been allocated by a
3184 subclass. */
3b5d3310 3185 if (ret == NULL)
252b5132
RH
3186 ret = ((struct ecoff_link_hash_entry *)
3187 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3b5d3310 3188 if (ret == NULL)
252b5132
RH
3189 return NULL;
3190
3191 /* Call the allocation method of the superclass. */
3192 ret = ((struct ecoff_link_hash_entry *)
3193 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3194 table, string));
3195
3196 if (ret)
3197 {
3198 /* Set local fields. */
3199 ret->indx = -1;
3200 ret->abfd = NULL;
3201 ret->written = 0;
3202 ret->small = 0;
3203 }
3b5d3310 3204 memset ((void *) &ret->esym, 0, sizeof ret->esym);
252b5132
RH
3205
3206 return (struct bfd_hash_entry *) ret;
3207}
3208
3209/* Create an ECOFF link hash table. */
3210
3211struct bfd_link_hash_table *
3b5d3310 3212_bfd_ecoff_bfd_link_hash_table_create (bfd *abfd)
252b5132
RH
3213{
3214 struct ecoff_link_hash_table *ret;
986f0783 3215 size_t amt = sizeof (struct ecoff_link_hash_table);
252b5132 3216
21d799b5 3217 ret = (struct ecoff_link_hash_table *) bfd_malloc (amt);
252b5132
RH
3218 if (ret == NULL)
3219 return NULL;
66eb6687
AM
3220 if (!_bfd_link_hash_table_init (&ret->root, abfd,
3221 ecoff_link_hash_newfunc,
3222 sizeof (struct ecoff_link_hash_entry)))
252b5132
RH
3223 {
3224 free (ret);
3b5d3310 3225 return NULL;
252b5132
RH
3226 }
3227 return &ret->root;
3228}
3229
3230/* Look up an entry in an ECOFF link hash table. */
3231
3232#define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3233 ((struct ecoff_link_hash_entry *) \
3234 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3235
252b5132
RH
3236/* Get the ECOFF link hash table from the info structure. This is
3237 just a cast. */
3238
3239#define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3240
3b5d3310
NC
3241/* Add the external symbols of an object file to the global linker
3242 hash table. The external symbols and strings we are passed are
3243 just allocated on the stack, and will be discarded. We must
3244 explicitly save any information we may need later on in the link.
3245 We do not want to read the external symbol information again. */
252b5132 3246
0a1b45a2 3247static bool
3b5d3310
NC
3248ecoff_link_add_externals (bfd *abfd,
3249 struct bfd_link_info *info,
3250 void * external_ext,
3251 char *ssext)
252b5132
RH
3252{
3253 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3b5d3310
NC
3254 void (* const swap_ext_in) (bfd *, void *, EXTR *)
3255 = backend->debug_swap.swap_ext_in;
3256 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3257 unsigned long ext_count;
3258 struct bfd_link_hash_entry **sym_hash;
3259 char *ext_ptr;
3260 char *ext_end;
3261 bfd_size_type amt;
252b5132 3262
3b5d3310 3263 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
252b5132 3264
3b5d3310
NC
3265 amt = ext_count;
3266 amt *= sizeof (struct bfd_link_hash_entry *);
21d799b5 3267 sym_hash = (struct bfd_link_hash_entry **) bfd_alloc (abfd, amt);
3b5d3310 3268 if (!sym_hash)
0a1b45a2 3269 return false;
3b5d3310 3270 ecoff_data (abfd)->sym_hashes = (struct ecoff_link_hash_entry **) sym_hash;
252b5132 3271
3b5d3310
NC
3272 ext_ptr = (char *) external_ext;
3273 ext_end = ext_ptr + ext_count * external_ext_size;
3274 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
252b5132 3275 {
3b5d3310 3276 EXTR esym;
0a1b45a2 3277 bool skip;
3b5d3310
NC
3278 bfd_vma value;
3279 asection *section;
252b5132 3280 const char *name;
3b5d3310 3281 struct ecoff_link_hash_entry *h;
252b5132 3282
3b5d3310 3283 *sym_hash = NULL;
252b5132 3284
3b5d3310 3285 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
252b5132 3286
3b5d3310 3287 /* Skip debugging symbols. */
0a1b45a2 3288 skip = false;
3b5d3310 3289 switch (esym.asym.st)
252b5132 3290 {
3b5d3310
NC
3291 case stGlobal:
3292 case stStatic:
3293 case stLabel:
3294 case stProc:
3295 case stStaticProc:
3296 break;
3297 default:
0a1b45a2 3298 skip = true;
3b5d3310 3299 break;
252b5132
RH
3300 }
3301
3b5d3310
NC
3302 if (skip)
3303 continue;
252b5132 3304
3b5d3310
NC
3305 /* Get the information for this symbol. */
3306 value = esym.asym.value;
3307 switch (esym.asym.sc)
252b5132 3308 {
3b5d3310
NC
3309 default:
3310 case scNil:
3311 case scRegister:
3312 case scCdbLocal:
3313 case scBits:
3314 case scCdbSystem:
3315 case scRegImage:
3316 case scInfo:
3317 case scUserStruct:
3318 case scVar:
3319 case scVarRegister:
3320 case scVariant:
3321 case scBasedVar:
3322 case scXData:
3323 case scPData:
3324 section = NULL;
3325 break;
3326 case scText:
3327 section = bfd_make_section_old_way (abfd, _TEXT);
3328 value -= section->vma;
3329 break;
3330 case scData:
3331 section = bfd_make_section_old_way (abfd, _DATA);
3332 value -= section->vma;
3333 break;
3334 case scBss:
3335 section = bfd_make_section_old_way (abfd, _BSS);
3336 value -= section->vma;
3337 break;
3338 case scAbs:
3339 section = bfd_abs_section_ptr;
3340 break;
3341 case scUndefined:
3342 section = bfd_und_section_ptr;
3343 break;
3344 case scSData:
3345 section = bfd_make_section_old_way (abfd, _SDATA);
3346 value -= section->vma;
3347 break;
3348 case scSBss:
3349 section = bfd_make_section_old_way (abfd, _SBSS);
3350 value -= section->vma;
3351 break;
3352 case scRData:
3353 section = bfd_make_section_old_way (abfd, _RDATA);
3354 value -= section->vma;
3355 break;
3356 case scCommon:
3357 if (value > ecoff_data (abfd)->gp_size)
252b5132 3358 {
3b5d3310
NC
3359 section = bfd_com_section_ptr;
3360 break;
252b5132 3361 }
3b5d3310
NC
3362 /* Fall through. */
3363 case scSCommon:
3b5d3310
NC
3364 section = &ecoff_scom_section;
3365 break;
3366 case scSUndefined:
3367 section = bfd_und_section_ptr;
3368 break;
3369 case scInit:
3370 section = bfd_make_section_old_way (abfd, _INIT);
3371 value -= section->vma;
3372 break;
3373 case scFini:
3374 section = bfd_make_section_old_way (abfd, _FINI);
3375 value -= section->vma;
3376 break;
3377 case scRConst:
3378 section = bfd_make_section_old_way (abfd, _RCONST);
3379 value -= section->vma;
3380 break;
252b5132
RH
3381 }
3382
3b5d3310
NC
3383 if (section == NULL)
3384 continue;
252b5132 3385
3b5d3310 3386 name = ssext + esym.asym.iss;
252b5132 3387
3b5d3310
NC
3388 if (! (_bfd_generic_link_add_one_symbol
3389 (info, abfd, name,
3390 (flagword) (esym.weakext ? BSF_WEAK : BSF_GLOBAL),
0a1b45a2
AM
3391 section, value, NULL, true, true, sym_hash)))
3392 return false;
252b5132 3393
3b5d3310
NC
3394 h = (struct ecoff_link_hash_entry *) *sym_hash;
3395
3396 /* If we are building an ECOFF hash table, save the external
3397 symbol information. */
f13a99db 3398 if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
3b5d3310
NC
3399 {
3400 if (h->abfd == NULL
3401 || (! bfd_is_und_section (section)
3402 && (! bfd_is_com_section (section)
3403 || (h->root.type != bfd_link_hash_defined
3404 && h->root.type != bfd_link_hash_defweak))))
3405 {
3406 h->abfd = abfd;
3407 h->esym = esym;
3408 }
3409
3410 /* Remember whether this symbol was small undefined. */
3411 if (esym.asym.sc == scSUndefined)
3412 h->small = 1;
3413
3414 /* If this symbol was ever small undefined, it needs to wind
3415 up in a GP relative section. We can't control the
3416 section of a defined symbol, but we can control the
3417 section of a common symbol. This case is actually needed
3418 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3419 if (h->small
3420 && h->root.type == bfd_link_hash_common
3421 && streq (h->root.u.c.p->section->name, SCOMMON))
3422 {
3423 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
3424 SCOMMON);
3425 h->root.u.c.p->section->flags = SEC_ALLOC;
3426 if (h->esym.asym.sc == scCommon)
3427 h->esym.asym.sc = scSCommon;
3428 }
3429 }
252b5132
RH
3430 }
3431
0a1b45a2 3432 return true;
252b5132
RH
3433}
3434
3b5d3310
NC
3435/* Add symbols from an ECOFF object file to the global linker hash
3436 table. */
3437
0a1b45a2 3438static bool
3b5d3310
NC
3439ecoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
3440{
3441 HDRR *symhdr;
3442 bfd_size_type external_ext_size;
3443 void * external_ext = NULL;
3444 bfd_size_type esize;
3445 char *ssext = NULL;
0a1b45a2 3446 bool result;
3b5d3310
NC
3447
3448 if (! ecoff_slurp_symbolic_header (abfd))
0a1b45a2 3449 return false;
3b5d3310
NC
3450
3451 /* If there are no symbols, we don't want it. */
3452 if (bfd_get_symcount (abfd) == 0)
0a1b45a2 3453 return true;
3b5d3310
NC
3454
3455 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3456
3457 /* Read in the external symbols and external strings. */
2bb3687b 3458 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0)
0a1b45a2 3459 return false;
3b5d3310
NC
3460 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3461 esize = symhdr->iextMax * external_ext_size;
2bb3687b 3462 external_ext = _bfd_malloc_and_read (abfd, esize, esize);
3b5d3310
NC
3463 if (external_ext == NULL && esize != 0)
3464 goto error_return;
3465
2bb3687b 3466 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0)
3b5d3310 3467 goto error_return;
2bb3687b
AM
3468 ssext = (char *) _bfd_malloc_and_read (abfd, symhdr->issExtMax,
3469 symhdr->issExtMax);
3b5d3310
NC
3470 if (ssext == NULL && symhdr->issExtMax != 0)
3471 goto error_return;
3472
3b5d3310
NC
3473 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3474
c9594989
AM
3475 free (ssext);
3476 free (external_ext);
3b5d3310
NC
3477 return result;
3478
3479 error_return:
c9594989
AM
3480 free (ssext);
3481 free (external_ext);
0a1b45a2 3482 return false;
3b5d3310
NC
3483}
3484
252b5132
RH
3485/* This is called if we used _bfd_generic_link_add_archive_symbols
3486 because we were not dealing with an ECOFF archive. */
3487
0a1b45a2 3488static bool
3b5d3310
NC
3489ecoff_link_check_archive_element (bfd *abfd,
3490 struct bfd_link_info *info,
13e570f8
AM
3491 struct bfd_link_hash_entry *h,
3492 const char *name,
0a1b45a2 3493 bool *pneeded)
252b5132 3494{
0a1b45a2 3495 *pneeded = false;
252b5132 3496
13e570f8
AM
3497 /* Unlike the generic linker, we do not pull in elements because
3498 of common symbols. */
3499 if (h->type != bfd_link_hash_undefined)
0a1b45a2 3500 return true;
252b5132 3501
b95a0a31 3502 /* Include this element? */
13e570f8 3503 if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
0a1b45a2
AM
3504 return true;
3505 *pneeded = true;
252b5132 3506
13e570f8 3507 return ecoff_link_add_object_symbols (abfd, info);
252b5132
RH
3508}
3509
3b5d3310
NC
3510/* Add the symbols from an archive file to the global hash table.
3511 This looks through the undefined symbols, looks each one up in the
3512 archive hash table, and adds any associated object file. We do not
3513 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3514 already have a hash table, so there is no reason to construct
3515 another one. */
252b5132 3516
0a1b45a2 3517static bool
3b5d3310 3518ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
252b5132 3519{
3b5d3310
NC
3520 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3521 const bfd_byte *raw_armap;
3522 struct bfd_link_hash_entry **pundef;
3523 unsigned int armap_count;
3524 unsigned int armap_log;
3525 unsigned int i;
3526 const bfd_byte *hashtable;
3527 const char *stringbase;
252b5132 3528
3b5d3310
NC
3529 if (! bfd_has_map (abfd))
3530 {
3531 /* An empty archive is a special case. */
3532 if (bfd_openr_next_archived_file (abfd, NULL) == NULL)
0a1b45a2 3533 return true;
3b5d3310 3534 bfd_set_error (bfd_error_no_armap);
0a1b45a2 3535 return false;
3b5d3310 3536 }
252b5132 3537
3b5d3310
NC
3538 /* If we don't have any raw data for this archive, as can happen on
3539 Irix 4.0.5F, we call the generic routine.
3540 FIXME: We should be more clever about this, since someday tdata
3541 may get to something for a generic archive. */
3542 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3543 if (raw_armap == NULL)
3544 return (_bfd_generic_link_add_archive_symbols
3545 (abfd, info, ecoff_link_check_archive_element));
252b5132 3546
3b5d3310 3547 armap_count = H_GET_32 (abfd, raw_armap);
252b5132 3548
3b5d3310
NC
3549 armap_log = 0;
3550 for (i = 1; i < armap_count; i <<= 1)
3551 armap_log++;
3552 BFD_ASSERT (i == armap_count);
252b5132 3553
3b5d3310
NC
3554 hashtable = raw_armap + 4;
3555 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
252b5132 3556
3b5d3310
NC
3557 /* Look through the list of undefined symbols. */
3558 pundef = &info->hash->undefs;
3559 while (*pundef != NULL)
3560 {
3561 struct bfd_link_hash_entry *h;
1b0b5b1b 3562 unsigned int hash, rehash = 0;
3b5d3310
NC
3563 unsigned int file_offset;
3564 const char *name;
3565 bfd *element;
252b5132 3566
3b5d3310 3567 h = *pundef;
252b5132 3568
3b5d3310
NC
3569 /* When a symbol is defined, it is not necessarily removed from
3570 the list. */
3571 if (h->type != bfd_link_hash_undefined
3572 && h->type != bfd_link_hash_common)
3573 {
3574 /* Remove this entry from the list, for general cleanliness
3575 and because we are going to look through the list again
3576 if we search any more libraries. We can't remove the
3577 entry if it is the tail, because that would lose any
3578 entries we add to the list later on. */
3579 if (*pundef != info->hash->undefs_tail)
3580 *pundef = (*pundef)->u.undef.next;
3581 else
3582 pundef = &(*pundef)->u.undef.next;
3583 continue;
3584 }
252b5132 3585
3b5d3310
NC
3586 /* Native ECOFF linkers do not pull in archive elements merely
3587 to satisfy common definitions, so neither do we. We leave
3588 them on the list, though, in case we are linking against some
3589 other object format. */
3590 if (h->type != bfd_link_hash_undefined)
3591 {
3592 pundef = &(*pundef)->u.undef.next;
3593 continue;
3594 }
252b5132 3595
3b5d3310
NC
3596 /* Look for this symbol in the archive hash table. */
3597 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3598 armap_log);
252b5132 3599
3b5d3310
NC
3600 file_offset = H_GET_32 (abfd, hashtable + (hash * 8) + 4);
3601 if (file_offset == 0)
252b5132 3602 {
3b5d3310
NC
3603 /* Nothing in this slot. */
3604 pundef = &(*pundef)->u.undef.next;
3605 continue;
252b5132
RH
3606 }
3607
3b5d3310
NC
3608 name = stringbase + H_GET_32 (abfd, hashtable + (hash * 8));
3609 if (name[0] != h->root.string[0]
3610 || ! streq (name, h->root.string))
252b5132 3611 {
3b5d3310 3612 unsigned int srch;
0a1b45a2 3613 bool found;
3b5d3310
NC
3614
3615 /* That was the wrong symbol. Try rehashing. */
0a1b45a2 3616 found = false;
3b5d3310
NC
3617 for (srch = (hash + rehash) & (armap_count - 1);
3618 srch != hash;
3619 srch = (srch + rehash) & (armap_count - 1))
252b5132 3620 {
3b5d3310
NC
3621 file_offset = H_GET_32 (abfd, hashtable + (srch * 8) + 4);
3622 if (file_offset == 0)
3623 break;
3624 name = stringbase + H_GET_32 (abfd, hashtable + (srch * 8));
3625 if (name[0] == h->root.string[0]
3626 && streq (name, h->root.string))
3627 {
0a1b45a2 3628 found = true;
3b5d3310
NC
3629 break;
3630 }
252b5132 3631 }
3b5d3310
NC
3632
3633 if (! found)
252b5132 3634 {
3b5d3310
NC
3635 pundef = &(*pundef)->u.undef.next;
3636 continue;
252b5132 3637 }
3b5d3310
NC
3638
3639 hash = srch;
252b5132
RH
3640 }
3641
3b5d3310
NC
3642 element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
3643 if (element == NULL)
0a1b45a2 3644 return false;
252b5132 3645
3b5d3310 3646 if (! bfd_check_format (element, bfd_object))
0a1b45a2 3647 return false;
252b5132 3648
3b5d3310
NC
3649 /* Unlike the generic linker, we know that this element provides
3650 a definition for an undefined symbol and we know that we want
3651 to include it. We don't need to check anything. */
0e144ba7
AM
3652 if (!(*info->callbacks
3653 ->add_archive_element) (info, element, name, &element))
0a1b45a2 3654 return false;
0e144ba7 3655 if (! ecoff_link_add_object_symbols (element, info))
0a1b45a2 3656 return false;
252b5132 3657
3b5d3310
NC
3658 pundef = &(*pundef)->u.undef.next;
3659 }
252b5132 3660
0a1b45a2 3661 return true;
3b5d3310 3662}
252b5132 3663
3b5d3310
NC
3664/* Given an ECOFF BFD, add symbols to the global hash table as
3665 appropriate. */
252b5132 3666
0a1b45a2 3667bool
3b5d3310
NC
3668_bfd_ecoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
3669{
3670 switch (bfd_get_format (abfd))
3671 {
3672 case bfd_object:
3673 return ecoff_link_add_object_symbols (abfd, info);
3674 case bfd_archive:
3675 return ecoff_link_add_archive_symbols (abfd, info);
3676 default:
3677 bfd_set_error (bfd_error_wrong_format);
0a1b45a2 3678 return false;
252b5132 3679 }
252b5132 3680}
3b5d3310 3681
252b5132
RH
3682\f
3683/* ECOFF final link routines. */
3684
252b5132
RH
3685/* Structure used to pass information to ecoff_link_write_external. */
3686
3687struct extsym_info
3688{
3689 bfd *abfd;
3690 struct bfd_link_info *info;
3691};
3692
3b5d3310
NC
3693/* Accumulate the debugging information for an input BFD into the
3694 output BFD. This must read in the symbolic information of the
3695 input BFD. */
252b5132 3696
0a1b45a2 3697static bool
3b5d3310
NC
3698ecoff_final_link_debug_accumulate (bfd *output_bfd,
3699 bfd *input_bfd,
3700 struct bfd_link_info *info,
3701 void * handle)
252b5132 3702{
3b5d3310
NC
3703 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
3704 const struct ecoff_debug_swap * const swap =
3705 &ecoff_backend (input_bfd)->debug_swap;
3706 HDRR *symhdr = &debug->symbolic_header;
0a1b45a2 3707 bool ret;
252b5132 3708
1f4361a7
AM
3709#define READ(ptr, offset, count, size, type) \
3710 do \
3711 { \
3712 size_t amt; \
3713 debug->ptr = NULL; \
3714 if (symhdr->count == 0) \
3715 break; \
3716 if (_bfd_mul_overflow (size, symhdr->count, &amt)) \
3717 { \
3718 bfd_set_error (bfd_error_file_too_big); \
0a1b45a2 3719 ret = false; \
1f4361a7
AM
3720 goto return_something; \
3721 } \
2bb3687b 3722 if (bfd_seek (input_bfd, symhdr->offset, SEEK_SET) != 0) \
1f4361a7 3723 { \
0a1b45a2 3724 ret = false; \
1f4361a7
AM
3725 goto return_something; \
3726 } \
2bb3687b
AM
3727 debug->ptr = (type) _bfd_malloc_and_read (input_bfd, amt, amt); \
3728 if (debug->ptr == NULL) \
1f4361a7 3729 { \
0a1b45a2 3730 ret = false; \
1f4361a7
AM
3731 goto return_something; \
3732 } \
3733 } while (0)
252b5132 3734
3b5d3310
NC
3735 /* If raw_syments is not NULL, then the data was already by read by
3736 _bfd_ecoff_slurp_symbolic_info. */
3737 if (ecoff_data (input_bfd)->raw_syments == NULL)
3738 {
3739 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
3740 unsigned char *);
3741 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
3742 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
3743 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
3744 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
3745 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
3746 union aux_ext *);
3747 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
3748 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
3749 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
3750 }
3751#undef READ
252b5132 3752
3b5d3310 3753 /* We do not read the external strings or the external symbols. */
252b5132 3754
3b5d3310
NC
3755 ret = (bfd_ecoff_debug_accumulate
3756 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
3757 &ecoff_backend (output_bfd)->debug_swap,
3758 input_bfd, debug, swap, info));
252b5132 3759
3b5d3310
NC
3760 return_something:
3761 if (ecoff_data (input_bfd)->raw_syments == NULL)
3762 {
c9594989
AM
3763 free (debug->line);
3764 free (debug->external_dnr);
3765 free (debug->external_pdr);
3766 free (debug->external_sym);
3767 free (debug->external_opt);
3768 free (debug->external_aux);
3769 free (debug->ss);
3770 free (debug->external_fdr);
3771 free (debug->external_rfd);
252b5132 3772
3b5d3310
NC
3773 /* Make sure we don't accidentally follow one of these pointers
3774 into freed memory. */
3775 debug->line = NULL;
3776 debug->external_dnr = NULL;
3777 debug->external_pdr = NULL;
3778 debug->external_sym = NULL;
3779 debug->external_opt = NULL;
3780 debug->external_aux = NULL;
3781 debug->ss = NULL;
3782 debug->external_fdr = NULL;
3783 debug->external_rfd = NULL;
252b5132
RH
3784 }
3785
3b5d3310
NC
3786 return ret;
3787}
3788
3789/* Relocate and write an ECOFF section into an ECOFF output file. */
3790
0a1b45a2 3791static bool
3b5d3310
NC
3792ecoff_indirect_link_order (bfd *output_bfd,
3793 struct bfd_link_info *info,
3794 asection *output_section,
3795 struct bfd_link_order *link_order)
3796{
3797 asection *input_section;
3798 bfd *input_bfd;
3799 bfd_byte *contents = NULL;
3800 bfd_size_type external_reloc_size;
3801 bfd_size_type external_relocs_size;
3802 void * external_relocs = NULL;
3803
3804 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
3805
3b5d3310
NC
3806 input_section = link_order->u.indirect.section;
3807 input_bfd = input_section->owner;
44da2da1 3808 if (input_section->size == 0)
0a1b45a2 3809 return true;
3b5d3310
NC
3810
3811 BFD_ASSERT (input_section->output_section == output_section);
3812 BFD_ASSERT (input_section->output_offset == link_order->offset);
3813 BFD_ASSERT (input_section->size == link_order->size);
3814
3815 /* Get the section contents. */
3816 if (!bfd_malloc_and_get_section (input_bfd, input_section, &contents))
3817 goto error_return;
3818
3819 /* Get the relocs. If we are relaxing MIPS code, they will already
3820 have been read in. Otherwise, we read them in now. */
3821 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
3822 external_relocs_size = external_reloc_size * input_section->reloc_count;
3823
2bb3687b 3824 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0)
3b5d3310 3825 goto error_return;
2bb3687b
AM
3826 external_relocs = _bfd_malloc_and_read (input_bfd, external_relocs_size,
3827 external_relocs_size);
3828 if (external_relocs == NULL && external_relocs_size != 0)
3b5d3310
NC
3829 goto error_return;
3830
3831 /* Relocate the section contents. */
3832 if (! ((*ecoff_backend (input_bfd)->relocate_section)
3833 (output_bfd, info, input_bfd, input_section, contents,
3834 external_relocs)))
3835 goto error_return;
3836
3837 /* Write out the relocated section. */
3838 if (! bfd_set_section_contents (output_bfd,
3839 output_section,
3840 contents,
3841 input_section->output_offset,
3842 input_section->size))
3843 goto error_return;
252b5132 3844
3b5d3310
NC
3845 /* If we are producing relocatable output, the relocs were
3846 modified, and we write them out now. We use the reloc_count
3847 field of output_section to keep track of the number of relocs we
3848 have output so far. */
0e1862bb 3849 if (bfd_link_relocatable (info))
252b5132 3850 {
3b5d3310
NC
3851 file_ptr pos = (output_section->rel_filepos
3852 + output_section->reloc_count * external_reloc_size);
3853 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
3854 || (bfd_bwrite (external_relocs, external_relocs_size, output_bfd)
3855 != external_relocs_size))
3856 goto error_return;
3857 output_section->reloc_count += input_section->reloc_count;
252b5132
RH
3858 }
3859
c9594989
AM
3860 free (contents);
3861 free (external_relocs);
0a1b45a2 3862 return true;
252b5132 3863
3b5d3310 3864 error_return:
c9594989
AM
3865 free (contents);
3866 free (external_relocs);
0a1b45a2 3867 return false;
3b5d3310 3868}
252b5132 3869
3b5d3310
NC
3870/* Generate a reloc when linking an ECOFF file. This is a reloc
3871 requested by the linker, and does come from any input file. This
3872 is used to build constructor and destructor tables when linking
3873 with -Ur. */
252b5132 3874
0a1b45a2 3875static bool
3b5d3310
NC
3876ecoff_reloc_link_order (bfd *output_bfd,
3877 struct bfd_link_info *info,
3878 asection *output_section,
3879 struct bfd_link_order *link_order)
3880{
3881 enum bfd_link_order_type type;
3882 asection *section;
3883 bfd_vma addend;
3884 arelent rel;
3885 struct internal_reloc in;
3886 bfd_size_type external_reloc_size;
3887 bfd_byte *rbuf;
0a1b45a2 3888 bool ok;
3b5d3310
NC
3889 file_ptr pos;
3890
3891 type = link_order->type;
3892 section = NULL;
3893 addend = link_order->u.reloc.p->addend;
3894
3895 /* We set up an arelent to pass to the backend adjust_reloc_out
3896 routine. */
3897 rel.address = link_order->offset;
3898
3899 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
3900 if (rel.howto == 0)
252b5132 3901 {
3b5d3310 3902 bfd_set_error (bfd_error_bad_value);
0a1b45a2 3903 return false;
252b5132
RH
3904 }
3905
3b5d3310
NC
3906 if (type == bfd_section_reloc_link_order)
3907 {
3908 section = link_order->u.reloc.p->u.section;
3909 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
3910 }
3911 else
252b5132
RH
3912 {
3913 struct bfd_link_hash_entry *h;
3914
3b5d3310 3915 /* Treat a reloc against a defined symbol as though it were
07d6d2b8 3916 actually against the section. */
3b5d3310
NC
3917 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
3918 link_order->u.reloc.p->u.name,
0a1b45a2 3919 false, false, false);
3b5d3310
NC
3920 if (h != NULL
3921 && (h->type == bfd_link_hash_defined
3922 || h->type == bfd_link_hash_defweak))
252b5132 3923 {
3b5d3310
NC
3924 type = bfd_section_reloc_link_order;
3925 section = h->u.def.section->output_section;
3926 /* It seems that we ought to add the symbol value to the
07d6d2b8
AM
3927 addend here, but in practice it has already been added
3928 because it was passed to constructor_callback. */
3b5d3310 3929 addend += section->vma + h->u.def.section->output_offset;
252b5132
RH
3930 }
3931 else
3932 {
3b5d3310
NC
3933 /* We can't set up a reloc against a symbol correctly,
3934 because we have no asymbol structure. Currently no
3935 adjust_reloc_out routine cares. */
3936 rel.sym_ptr_ptr = NULL;
3937 }
3938 }
3939
3940 /* All ECOFF relocs are in-place. Put the addend into the object
3941 file. */
3942
3943 BFD_ASSERT (rel.howto->partial_inplace);
3944 if (addend != 0)
3945 {
3946 bfd_size_type size;
3947 bfd_reloc_status_type rstat;
3948 bfd_byte *buf;
3949
3950 size = bfd_get_reloc_size (rel.howto);
21d799b5 3951 buf = (bfd_byte *) bfd_zmalloc (size);
6346d5ca 3952 if (buf == NULL && size != 0)
0a1b45a2 3953 return false;
3b5d3310
NC
3954 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
3955 (bfd_vma) addend, buf);
3956 switch (rstat)
3957 {
3958 case bfd_reloc_ok:
3959 break;
3960 default:
3961 case bfd_reloc_outofrange:
3962 abort ();
3963 case bfd_reloc_overflow:
1a72702b
AM
3964 (*info->callbacks->reloc_overflow)
3965 (info, NULL,
3966 (link_order->type == bfd_section_reloc_link_order
fd361982 3967 ? bfd_section_name (section)
1a72702b
AM
3968 : link_order->u.reloc.p->u.name),
3969 rel.howto->name, addend, NULL, NULL, (bfd_vma) 0);
3b5d3310 3970 break;
252b5132 3971 }
3b5d3310
NC
3972 ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
3973 (file_ptr) link_order->offset, size);
3974 free (buf);
3975 if (! ok)
0a1b45a2 3976 return false;
252b5132
RH
3977 }
3978
3b5d3310
NC
3979 rel.addend = 0;
3980
3981 /* Move the information into an internal_reloc structure. */
fd361982 3982 in.r_vaddr = rel.address + bfd_section_vma (output_section);
3b5d3310
NC
3983 in.r_type = rel.howto->type;
3984
3985 if (type == bfd_symbol_reloc_link_order)
252b5132 3986 {
3b5d3310
NC
3987 struct ecoff_link_hash_entry *h;
3988
3989 h = ((struct ecoff_link_hash_entry *)
3990 bfd_wrapped_link_hash_lookup (output_bfd, info,
3991 link_order->u.reloc.p->u.name,
0a1b45a2 3992 false, false, true));
3b5d3310
NC
3993 if (h != NULL
3994 && h->indx != -1)
3995 in.r_symndx = h->indx;
3996 else
252b5132 3997 {
1a72702b
AM
3998 (*info->callbacks->unattached_reloc)
3999 (info, link_order->u.reloc.p->u.name, NULL, NULL, (bfd_vma) 0);
3b5d3310 4000 in.r_symndx = 0;
252b5132 4001 }
3b5d3310 4002 in.r_extern = 1;
252b5132 4003 }
3b5d3310
NC
4004 else
4005 {
4006 const char *name;
4007 unsigned int i;
4008 static struct
4009 {
4010 const char * name;
4011 long r_symndx;
4012 }
4013 section_symndx [] =
4014 {
4015 { _TEXT, RELOC_SECTION_TEXT },
4016 { _RDATA, RELOC_SECTION_RDATA },
4017 { _DATA, RELOC_SECTION_DATA },
4018 { _SDATA, RELOC_SECTION_SDATA },
4019 { _SBSS, RELOC_SECTION_SBSS },
4020 { _BSS, RELOC_SECTION_BSS },
4021 { _INIT, RELOC_SECTION_INIT },
4022 { _LIT8, RELOC_SECTION_LIT8 },
4023 { _LIT4, RELOC_SECTION_LIT4 },
4024 { _XDATA, RELOC_SECTION_XDATA },
4025 { _PDATA, RELOC_SECTION_PDATA },
4026 { _FINI, RELOC_SECTION_FINI },
4027 { _LITA, RELOC_SECTION_LITA },
4028 { "*ABS*", RELOC_SECTION_ABS },
4029 { _RCONST, RELOC_SECTION_RCONST }
4030 };
252b5132 4031
fd361982 4032 name = bfd_section_name (section);
252b5132 4033
3b5d3310
NC
4034 for (i = 0; i < ARRAY_SIZE (section_symndx); i++)
4035 if (streq (name, section_symndx[i].name))
4036 {
4037 in.r_symndx = section_symndx[i].r_symndx;
4038 break;
4039 }
252b5132 4040
3b5d3310
NC
4041 if (i == ARRAY_SIZE (section_symndx))
4042 abort ();
252b5132 4043
3b5d3310 4044 in.r_extern = 0;
252b5132
RH
4045 }
4046
3b5d3310
NC
4047 /* Let the BFD backend adjust the reloc. */
4048 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
252b5132 4049
3b5d3310
NC
4050 /* Get some memory and swap out the reloc. */
4051 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
21d799b5 4052 rbuf = (bfd_byte *) bfd_malloc (external_reloc_size);
3b5d3310 4053 if (rbuf == NULL)
0a1b45a2 4054 return false;
252b5132 4055
3b5d3310 4056 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (void *) rbuf);
252b5132 4057
3b5d3310
NC
4058 pos = (output_section->rel_filepos
4059 + output_section->reloc_count * external_reloc_size);
4060 ok = (bfd_seek (output_bfd, pos, SEEK_SET) == 0
4061 && (bfd_bwrite ((void *) rbuf, external_reloc_size, output_bfd)
4062 == external_reloc_size));
252b5132 4063
3b5d3310
NC
4064 if (ok)
4065 ++output_section->reloc_count;
252b5132 4066
3b5d3310
NC
4067 free (rbuf);
4068
4069 return ok;
252b5132
RH
4070}
4071
4072/* Put out information for an external symbol. These come only from
4073 the hash table. */
4074
0a1b45a2 4075static bool
7686d77d 4076ecoff_link_write_external (struct bfd_hash_entry *bh, void * data)
252b5132 4077{
7686d77d 4078 struct ecoff_link_hash_entry *h = (struct ecoff_link_hash_entry *) bh;
252b5132
RH
4079 struct extsym_info *einfo = (struct extsym_info *) data;
4080 bfd *output_bfd = einfo->abfd;
0a1b45a2 4081 bool strip;
252b5132 4082
e92d460e
AM
4083 if (h->root.type == bfd_link_hash_warning)
4084 {
4085 h = (struct ecoff_link_hash_entry *) h->root.u.i.link;
4086 if (h->root.type == bfd_link_hash_new)
0a1b45a2 4087 return true;
e92d460e
AM
4088 }
4089
1abaf976 4090 /* We need to check if this symbol is being stripped. */
252b5132
RH
4091 if (h->root.type == bfd_link_hash_undefined
4092 || h->root.type == bfd_link_hash_undefweak)
0a1b45a2 4093 strip = false;
252b5132
RH
4094 else if (einfo->info->strip == strip_all
4095 || (einfo->info->strip == strip_some
4096 && bfd_hash_lookup (einfo->info->keep_hash,
4097 h->root.root.string,
0a1b45a2
AM
4098 false, false) == NULL))
4099 strip = true;
252b5132 4100 else
0a1b45a2 4101 strip = false;
252b5132
RH
4102
4103 if (strip || h->written)
0a1b45a2 4104 return true;
252b5132 4105
3b5d3310 4106 if (h->abfd == NULL)
252b5132
RH
4107 {
4108 h->esym.jmptbl = 0;
4109 h->esym.cobol_main = 0;
4110 h->esym.weakext = 0;
4111 h->esym.reserved = 0;
4112 h->esym.ifd = ifdNil;
4113 h->esym.asym.value = 0;
4114 h->esym.asym.st = stGlobal;
4115
4116 if (h->root.type != bfd_link_hash_defined
4117 && h->root.type != bfd_link_hash_defweak)
4118 h->esym.asym.sc = scAbs;
4119 else
4120 {
4121 asection *output_section;
4122 const char *name;
3b5d3310
NC
4123 unsigned int i;
4124 static struct
4125 {
4126 const char * name;
4127 int sc;
4128 }
4129 section_storage_classes [] =
4130 {
4131 { _TEXT, scText },
4132 { _DATA, scData },
4133 { _SDATA, scSData },
4134 { _RDATA, scRData },
4135 { _BSS, scBss },
4136 { _SBSS, scSBss },
4137 { _INIT, scInit },
4138 { _FINI, scFini },
4139 { _PDATA, scPData },
4140 { _XDATA, scXData },
4141 { _RCONST, scRConst }
4142 };
252b5132
RH
4143
4144 output_section = h->root.u.def.section->output_section;
fd361982 4145 name = bfd_section_name (output_section);
1abaf976 4146
3b5d3310
NC
4147 for (i = 0; i < ARRAY_SIZE (section_storage_classes); i++)
4148 if (streq (name, section_storage_classes[i].name))
4149 {
4150 h->esym.asym.sc = section_storage_classes[i].sc;
4151 break;
4152 }
4153
4154 if (i == ARRAY_SIZE (section_storage_classes))
252b5132
RH
4155 h->esym.asym.sc = scAbs;
4156 }
4157
4158 h->esym.asym.reserved = 0;
4159 h->esym.asym.index = indexNil;
4160 }
4161 else if (h->esym.ifd != -1)
4162 {
4163 struct ecoff_debug_info *debug;
4164
4165 /* Adjust the FDR index for the symbol by that used for the
4166 input BFD. */
4167 debug = &ecoff_data (h->abfd)->debug_info;
4168 BFD_ASSERT (h->esym.ifd >= 0
4169 && h->esym.ifd < debug->symbolic_header.ifdMax);
4170 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4171 }
4172
4173 switch (h->root.type)
4174 {
4175 default:
e92d460e 4176 case bfd_link_hash_warning:
252b5132
RH
4177 case bfd_link_hash_new:
4178 abort ();
4179 case bfd_link_hash_undefined:
4180 case bfd_link_hash_undefweak:
4181 if (h->esym.asym.sc != scUndefined
4182 && h->esym.asym.sc != scSUndefined)
4183 h->esym.asym.sc = scUndefined;
4184 break;
4185 case bfd_link_hash_defined:
4186 case bfd_link_hash_defweak:
4187 if (h->esym.asym.sc == scUndefined
4188 || h->esym.asym.sc == scSUndefined)
4189 h->esym.asym.sc = scAbs;
4190 else if (h->esym.asym.sc == scCommon)
4191 h->esym.asym.sc = scBss;
4192 else if (h->esym.asym.sc == scSCommon)
4193 h->esym.asym.sc = scSBss;
4194 h->esym.asym.value = (h->root.u.def.value
4195 + h->root.u.def.section->output_section->vma
4196 + h->root.u.def.section->output_offset);
4197 break;
4198 case bfd_link_hash_common:
4199 if (h->esym.asym.sc != scCommon
4200 && h->esym.asym.sc != scSCommon)
4201 h->esym.asym.sc = scCommon;
4202 h->esym.asym.value = h->root.u.c.size;
4203 break;
4204 case bfd_link_hash_indirect:
e92d460e
AM
4205 /* We ignore these symbols, since the indirected symbol is
4206 already in the hash table. */
0a1b45a2 4207 return true;
252b5132
RH
4208 }
4209
4210 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4211 symbol number. */
4212 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4213 h->written = 1;
4214
4215 return (bfd_ecoff_debug_one_external
4216 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4217 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4218 &h->esym));
4219}
4220
3b5d3310
NC
4221/* ECOFF final link routine. This looks through all the input BFDs
4222 and gathers together all the debugging information, and then
4223 processes all the link order information. This may cause it to
4224 close and reopen some input BFDs; I'll see how bad this is. */
252b5132 4225
0a1b45a2 4226bool
3b5d3310 4227_bfd_ecoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
252b5132 4228{
3b5d3310
NC
4229 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4230 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4231 HDRR *symhdr;
4232 void * handle;
252b5132 4233 bfd *input_bfd;
3b5d3310
NC
4234 asection *o;
4235 struct bfd_link_order *p;
4236 struct extsym_info einfo;
252b5132 4237
3b5d3310
NC
4238 /* We accumulate the debugging information counts in the symbolic
4239 header. */
4240 symhdr = &debug->symbolic_header;
4241 symhdr->vstamp = 0;
4242 symhdr->ilineMax = 0;
4243 symhdr->cbLine = 0;
4244 symhdr->idnMax = 0;
4245 symhdr->ipdMax = 0;
4246 symhdr->isymMax = 0;
4247 symhdr->ioptMax = 0;
4248 symhdr->iauxMax = 0;
4249 symhdr->issMax = 0;
4250 symhdr->issExtMax = 0;
4251 symhdr->ifdMax = 0;
4252 symhdr->crfd = 0;
4253 symhdr->iextMax = 0;
252b5132 4254
3b5d3310
NC
4255 /* We accumulate the debugging information itself in the debug_info
4256 structure. */
4257 debug->line = NULL;
4258 debug->external_dnr = NULL;
4259 debug->external_pdr = NULL;
4260 debug->external_sym = NULL;
4261 debug->external_opt = NULL;
4262 debug->external_aux = NULL;
4263 debug->ss = NULL;
4264 debug->ssext = debug->ssext_end = NULL;
4265 debug->external_fdr = NULL;
4266 debug->external_rfd = NULL;
4267 debug->external_ext = debug->external_ext_end = NULL;
252b5132 4268
3b5d3310
NC
4269 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4270 if (handle == NULL)
0a1b45a2 4271 return false;
252b5132 4272
3b5d3310
NC
4273 /* Accumulate the debugging symbols from each input BFD. */
4274 for (input_bfd = info->input_bfds;
4275 input_bfd != NULL;
c72f2fb2 4276 input_bfd = input_bfd->link.next)
3b5d3310 4277 {
0a1b45a2 4278 bool ret;
252b5132 4279
3b5d3310
NC
4280 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4281 {
4282 /* Arbitrarily set the symbolic header vstamp to the vstamp
4283 of the first object file in the link. */
4284 if (symhdr->vstamp == 0)
4285 symhdr->vstamp
4286 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4287 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4288 handle);
4289 }
4290 else
4291 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4292 debug, &backend->debug_swap,
4293 input_bfd, info);
4294 if (! ret)
0a1b45a2 4295 return false;
252b5132 4296
3b5d3310
NC
4297 /* Combine the register masks. */
4298 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4299 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4300 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4301 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4302 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4303 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4304 }
252b5132 4305
3b5d3310
NC
4306 /* Write out the external symbols. */
4307 einfo.abfd = abfd;
4308 einfo.info = info;
7686d77d 4309 bfd_hash_traverse (&info->hash->table, ecoff_link_write_external, &einfo);
252b5132 4310
0e1862bb 4311 if (bfd_link_relocatable (info))
252b5132 4312 {
3b5d3310
NC
4313 /* We need to make a pass over the link_orders to count up the
4314 number of relocations we will need to output, so that we know
4315 how much space they will take up. */
4316 for (o = abfd->sections; o != NULL; o = o->next)
4317 {
4318 o->reloc_count = 0;
8423293d 4319 for (p = o->map_head.link_order;
3b5d3310
NC
4320 p != NULL;
4321 p = p->next)
4322 if (p->type == bfd_indirect_link_order)
4323 o->reloc_count += p->u.indirect.section->reloc_count;
4324 else if (p->type == bfd_section_reloc_link_order
4325 || p->type == bfd_symbol_reloc_link_order)
4326 ++o->reloc_count;
4327 }
252b5132
RH
4328 }
4329
3b5d3310
NC
4330 /* Compute the reloc and symbol file positions. */
4331 ecoff_compute_reloc_file_positions (abfd);
252b5132 4332
3b5d3310
NC
4333 /* Write out the debugging information. */
4334 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4335 &backend->debug_swap, info,
4336 ecoff_data (abfd)->sym_filepos))
0a1b45a2 4337 return false;
252b5132 4338
3b5d3310 4339 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
252b5132 4340
0e1862bb 4341 if (bfd_link_relocatable (info))
252b5132 4342 {
3b5d3310
NC
4343 /* Now reset the reloc_count field of the sections in the output
4344 BFD to 0, so that we can use them to keep track of how many
4345 relocs we have output thus far. */
4346 for (o = abfd->sections; o != NULL; o = o->next)
4347 o->reloc_count = 0;
252b5132
RH
4348 }
4349
3b5d3310
NC
4350 /* Get a value for the GP register. */
4351 if (ecoff_data (abfd)->gp == 0)
252b5132
RH
4352 {
4353 struct bfd_link_hash_entry *h;
4354
0a1b45a2 4355 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
252b5132 4356 if (h != NULL
3b5d3310
NC
4357 && h->type == bfd_link_hash_defined)
4358 ecoff_data (abfd)->gp = (h->u.def.value
4359 + h->u.def.section->output_section->vma
4360 + h->u.def.section->output_offset);
0e1862bb 4361 else if (bfd_link_relocatable (info))
252b5132 4362 {
3b5d3310
NC
4363 bfd_vma lo;
4364
4365 /* Make up a value. */
4366 lo = (bfd_vma) -1;
4367 for (o = abfd->sections; o != NULL; o = o->next)
4368 {
4369 if (o->vma < lo
4370 && (streq (o->name, _SBSS)
4371 || streq (o->name, _SDATA)
4372 || streq (o->name, _LIT4)
4373 || streq (o->name, _LIT8)
4374 || streq (o->name, _LITA)))
4375 lo = o->vma;
4376 }
4377 ecoff_data (abfd)->gp = lo + 0x8000;
252b5132
RH
4378 }
4379 else
4380 {
3b5d3310
NC
4381 /* If the relocate_section function needs to do a reloc
4382 involving the GP value, it should make a reloc_dangerous
4383 callback to warn that GP is not defined. */
252b5132
RH
4384 }
4385 }
4386
3b5d3310 4387 for (o = abfd->sections; o != NULL; o = o->next)
252b5132 4388 {
8423293d 4389 for (p = o->map_head.link_order;
3b5d3310
NC
4390 p != NULL;
4391 p = p->next)
252b5132 4392 {
3b5d3310
NC
4393 if (p->type == bfd_indirect_link_order
4394 && (bfd_get_flavour (p->u.indirect.section->owner)
4395 == bfd_target_ecoff_flavour))
252b5132 4396 {
3b5d3310 4397 if (! ecoff_indirect_link_order (abfd, info, o, p))
0a1b45a2 4398 return false;
3b5d3310
NC
4399 }
4400 else if (p->type == bfd_section_reloc_link_order
4401 || p->type == bfd_symbol_reloc_link_order)
4402 {
4403 if (! ecoff_reloc_link_order (abfd, info, o, p))
0a1b45a2 4404 return false;
3b5d3310
NC
4405 }
4406 else
4407 {
4408 if (! _bfd_default_link_order (abfd, info, o, p))
0a1b45a2 4409 return false;
252b5132 4410 }
252b5132 4411 }
252b5132
RH
4412 }
4413
ed48ec2e 4414 abfd->symcount = symhdr->iextMax + symhdr->isymMax;
252b5132 4415
0a1b45a2 4416 ecoff_data (abfd)->linker = true;
252b5132 4417
0a1b45a2 4418 return true;
252b5132 4419}