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