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