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