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