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