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